【问题标题】:How to know the current class inside shared concern如何知道共享关注中的当前类
【发布时间】:2018-10-31 17:47:45
【问题描述】:

我有 3 个模型,每个模型都有一个 hstore 列,其中可能包含相同的 4 个属性。促进这些 hstore 属性的代码包括 store_accessor 调用、用于与强参数共享这些 hstore 属性的方法以及其他一些方法。

非常相似(如果不准确的话)代码存在于 3 个不同的类中。

store_accessor 调用实际上被包装在一个循环中,该循环遍历一个类方法,该方法返回一个属性名称列表(对于 3 个模型中的每一个,属性名称可能是唯一的,也可能不是唯一的)。

class Foo

  def self.array_of_attrs
    %w(one two three)
  end

  Foo.array_of_attrs.each do |a|
    ...
    store_accessor :hstore_col_name, "#{ a }_yada_yada".to_sym
  end

很简单.. 但是,我想将所有这些代码移至关注点(嘘声,嘶嘶声),并与 3 个受影响的类中的每一个分享该关注点。我遇到的问题是......我不知道哪个班级目前正在关注这个问题。换句话说,Foo,不是 Foo……它是 3 个类中的任何一个使用关注点。

在关注点中,我如何使用当前类?在这个例子中,我将如何动态调用当前类而不是调用 Foo 类?

【问题讨论】:

  • 你试过self.class吗?
  • 我有...但是,self 是类。在类方法上调用 self 就像调用 self.self.xyz_method。我认为,也许,有点......就像,即使你想在类中调用一个类方法,你也不能使用 self ......你必须从内部调用类。我也觉得很困惑。
  • 您是否在关注点而不是课堂上尝试过使用代码?顺便说一句,确实是关心(嘘声,嘶嘶声)。
  • 我有...也许,我需要另一种 DRY 方法。不使用关注点的一种。
  • 我也觉得你的问题有点混乱,你试过self(不是self.class)吗?如果您在问题中包含关注点以及哪些类包含它,这将很有用。随着Foo 的实例尝试运行该函数。也许我们可以找到另一种 DRY 方法。

标签: ruby-on-rails activesupport-concern


【解决方案1】:

当您在关注点中使用included 时,包含类将作为参数传递给块:

module Bar
  extend ActiveSupport::Concern
  included do |base|
    base.array_of_attrs.each do |a|
     # ...
     store_accessor :hstore_col_name, "#{ a }_yada_yada".to_sym
    end
  end
end

class Foo < ApplicationRecord
  include Bar
end

是的,你应该使用included,因为访问器是在类上下文中声明的。

请记住,这只是一个语法糖:

module Baz
  def self.included(base)
    base.class_eval do
      # ...
    end
  end
end

【讨论】:

  • 谢谢马克斯!我不知道我可以将类作为参数传递给包含的块。这让我直截了当。
【解决方案2】:

看看这个:

module Foo
  def self.included(base)
    base.class_eval do

      def self.some_method
        array_of_attrs.each do |a|
          ...
          store_accessor :hstore_col_name, "#{ a }_yada_yada".to_sym
        end
      end

    end
  end
end

class Model < ApplicationRecord
  include Foo

  def self.array_of_attrs
    %w(one two three)
  end
end

Model.some_method

【讨论】:

    猜你喜欢
    • 2022-07-01
    • 2012-07-22
    • 2021-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多