我有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
足够简单。.但是,我想将所有这些代码移至关注点(boo,his),并与3个受影响的类中的每一个共享该关注点。我遇到的问题是...我不知道当前哪个班级正在关注该问题。换句话说,Foo不是Foo ...这是三个使用关注点的类别中的任何一个。
在关注范围内,我如何使用当前课程?在此示例中,我将如何动态调用当前类而不是调用Foo类?
答案 0 :(得分:1)
检查一下:
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
答案 1 :(得分: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