【问题标题】:Dynaimc class_name in ruby-associationruby 关联中的动态类名
【发布时间】:2018-04-02 21:24:14
【问题描述】:

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

当前状态
因为有几个模型具有与可复制元素相同的方法,所以我提出了一个问题。我尝试使用动态关联名称链接到自身的类,但是当我创建一个元素时,出现了 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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 哦...是的,你是对的。现在我明白出了什么问题。非常感谢。
    猜你喜欢
    • 2016-02-02
    • 1970-01-01
    • 2014-03-24
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    • 2014-06-10
    • 1970-01-01
    相关资源
    最近更新 更多