【问题标题】:Ruby on Rails has_many :through in a polymorphic associationRuby on Rails has_many:通过多态关联
【发布时间】:2016-03-02 09:35:15
【问题描述】:

我已经搜索和搜索,只找到了我当前问题的部分解决方案。

问题是,我想知道是否可以在 Ruby on Rails 中使用 has_many :through 和多态关联。

我有一个系统,students 可以为他们的项目创建travel plans(可以属于许多students)和refund claims(只能属于一个student)。在这个系统中,admin usersstudents 都可以对计划和索赔进行评论。

我的联想是:

class Student < ActiveRecord::Base
   has_and_belongs_to_many :travel_plans
   has_many :refund_claims
   has_many :comments, through: :travel_plans
   has_many :comments, through: :refund_claims
end

class AdminUser < ActiveRecord::Base
   has_many :comments
end

class TravelPlan < ActiveRecord::Base
   has_and_belongs_to_many :students
   has_many :comments, as: :commentable
end

class RefundClaim < ActiveRecord::Base
   belongs_to :student
   has_many :comments, as: :commentable
end

class Comment < ActiveRecord::Base
   belongs_to :commentable, polymorphic: true
end

我的问题是:

Student模型中关联两次comments是否正确?

我不希望AdminUsers 拥有travel plansrefund claims,我如何识别他们的comments 是在travel planrefund claim 上创建的?

会有更好的方法吗?

提前非常感谢大家!

干杯,

【问题讨论】:

    标签: ruby-on-rails activerecord associations


    【解决方案1】:

    您可能希望将多态 author 属性添加到 Comment 模型。比你只需要 has_many :comments, as: :authorStudentAdminUser 模型。

    如果这是一个新应用程序,并且您刚开始使用绿色领域,您可能需要重新考虑一下您的模型并添加一个Role 和一个User 模型。 Student 将是 roleuserAdminUser 一样。

    【讨论】:

    • 您好 Wintermeyer,感谢您的意见!是的,我从头开始,并事先彻底计划了所有的关联。我喜欢创建RoleUser 模型的想法,然后是Role belongs_to :userUser has_one :role,对吗?但是我仍然需要以某种方式确定评论是在 travel_plan 还是在 refund_claim... 还是我遗漏了什么?
    • 我想我对我刚才问你的问题有了一个答案:我必须在Comment模型中保留多态关联并保证Userhas_many :comments,然后我可以跟踪评论类型(travel_planrefund_claim)和 id。最后,我认为我不需要在User 模型中使用through:。我的推理正确吗?
    • 正确。顺便说一句:请检查(绿色复选标记)您喜欢的答案。
    • 非常感谢您的帮助!我会继续使用这个数据模型!
    【解决方案2】:

    在Student模型中关联两次cmets是否正确?

    不,不是真的。如果您有重复的关联名称,则只能使用其中一个。如果你想同时使用它们,你必须给它们起不同的名字。

    【讨论】:

    • 嗨,Marek,感谢您的意见!这是否意味着我可能必须拥有两个comments 模型,假设一个名为travel_comments,另一个名为refund_comments?这真的是唯一的方法吗?
    • 不,如果我没记错的话,您可以定义travel_commentsrefund_comments 关联并指定model_nameforeign_key 选项。
    • 这个定义会在Student模型中完成吗?
    猜你喜欢
    • 1970-01-01
    • 2012-01-14
    • 2012-06-12
    • 2010-12-28
    • 1970-01-01
    • 2011-01-13
    • 1970-01-01
    • 1970-01-01
    • 2014-12-16
    相关资源
    最近更新 更多