如何知道当前class里面的共同关注
How to know the current class inside shared concern
我有 3 个模型,每个模型都有一个 hstore 列,其中可能包含相同的 4 个属性。促进这些 hstore 属性的代码包括 store_accessor 调用,一种用于与强参数共享这些 hstore 属性的方法,以及一些其他方法。
非常相似,如果不完全一样,代码存在于 3 个不同的 classes 中。
store_accessor 调用实际上包含在一个循环中,该循环通过 class 方法循环,该方法 returns 属性名称列表(对于每个属性名称可能是唯一的,也可能不是唯一的) 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 个受影响的 class 中的每一个分享这个关注点。我遇到的问题是...我不知道目前是哪个 class 调用了这个问题。换句话说,Foo 不是 Foo...它是 3 classes 中使用关注点的那个。
关注里面,我怎么用现在的class?在此示例中,我将如何动态调用当前 class 而不是调用 Foo class?
看看这个:
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
当您在关注中使用 included
时,包含的 class 作为参数传递给块:
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
,因为访问器是在 class 上下文中声明的。
请记住,这只是一个语法糖:
module Baz
def self.included(base)
base.class_eval do
# ...
end
end
end
我有 3 个模型,每个模型都有一个 hstore 列,其中可能包含相同的 4 个属性。促进这些 hstore 属性的代码包括 store_accessor 调用,一种用于与强参数共享这些 hstore 属性的方法,以及一些其他方法。
非常相似,如果不完全一样,代码存在于 3 个不同的 classes 中。
store_accessor 调用实际上包含在一个循环中,该循环通过 class 方法循环,该方法 returns 属性名称列表(对于每个属性名称可能是唯一的,也可能不是唯一的) 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 个受影响的 class 中的每一个分享这个关注点。我遇到的问题是...我不知道目前是哪个 class 调用了这个问题。换句话说,Foo 不是 Foo...它是 3 classes 中使用关注点的那个。
关注里面,我怎么用现在的class?在此示例中,我将如何动态调用当前 class 而不是调用 Foo class?
看看这个:
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
当您在关注中使用 included
时,包含的 class 作为参数传递给块:
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
,因为访问器是在 class 上下文中声明的。
请记住,这只是一个语法糖:
module Baz
def self.included(base)
base.class_eval do
# ...
end
end
end