ruby 关联中的动态 class_name
Dynaimc class_name in ruby-association
问题
有一些模型应该复制为模板。
例如:有一个新闻条目,我想将它复制到几个组中。
所以复制的元素应该与模板有关联。模板应该与其元素有关联。
当前状态
因为有几个模型具有与可复制元素相同的方法,所以我产生了一个顾虑。我已经尝试将 link 的动态关联名称与其自身的 class 关联,但是当我创建一个元素时,会出现不匹配错误。
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
是否有动态解决方案,或者我应该将其从问题中删除并复制到所有模型?
在您的 included
块 self
中包含了 class。 self.class_name
可能就是您想要的。 self.class.class_name
是您所拥有的,并且要求模型 class 的 class,即 Class
。
唯一真正应该使用 self.class
的时候是当您在 class 的实例范围内并且需要访问该实例对象的 class 时。在您包含的块中,您已经处于 class 上下文中,因此 .class
正在请求 class 的 class。
Meta-programming 可能会让人感到困惑。希望这是有道理的。
问题
有一些模型应该复制为模板。
例如:有一个新闻条目,我想将它复制到几个组中。
所以复制的元素应该与模板有关联。模板应该与其元素有关联。
当前状态
因为有几个模型具有与可复制元素相同的方法,所以我产生了一个顾虑。我已经尝试将 link 的动态关联名称与其自身的 class 关联,但是当我创建一个元素时,会出现不匹配错误。
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
是否有动态解决方案,或者我应该将其从问题中删除并复制到所有模型?
在您的 included
块 self
中包含了 class。 self.class_name
可能就是您想要的。 self.class.class_name
是您所拥有的,并且要求模型 class 的 class,即 Class
。
唯一真正应该使用 self.class
的时候是当您在 class 的实例范围内并且需要访问该实例对象的 class 时。在您包含的块中,您已经处于 class 上下文中,因此 .class
正在请求 class 的 class。
Meta-programming 可能会让人感到困惑。希望这是有道理的。