ruby-association中的Dynaimc class_name

时间:2018-04-02 21:24:15

标签: ruby-on-rails ruby associations activesupport-concern

问题
有些模型应该作为模板复制 例如:有一个新闻条目,我想将其复制到几个组 因此复制的元素应该与模板有关联。模板应该与它的元素有关联。

当前状态
因为有几个模型使用与可复制元素相同的方法,所以我创造了一个问题。我已经尝试了一个动态关联名称来链接到自己的类,但是当我创建一个元素时,会出现一个Missmatch错误。

item = self.class.find_or_create_by(group: group, group_template: self)
ActiveRecord::AssociationTypeMismatch: Class(#18118120) expected, got News(#140451780)

关注中的关联

included do
  belongs_to :business_group
  belongs_to :group_template, class_name: self.class.name, foreign_key: :template_id
  has_many :group_elements, class_name: self.class.name, foreign_key: :template_id
end

是否存在动态解决方案,还是应该将其从关注点中删除并将其复制到所有模型?

1 个答案:

答案 0 :(得分:1)

included区块中self是要包含的类。 self.class_name可能就是你想要的。 self.class.class_name就是你所拥有的,并且正在要求一个模型类的类,即Class

你真正应该使用self.class的唯一时间是当你在一个类的实例范围内并且需要访问该实例对象的类时。在您包含的块中,您已经在类上下文中,因此.class要求提供类的类。

元编程可能会让人感到困惑。希望这是有道理的。