【问题标题】:Rails: has_many :through导轨:has_many:通过
【发布时间】:2012-09-18 18:23:51
【问题描述】:

我想弄清楚我的方法是否合适。我有一个用户模型和一个补偿模型。我需要允许应用程序管理员为每个用户记录分配补偿。这种补偿可能会随着时间的推移而变化,我想跟踪这些变化。经过一番研究,我认为 has_many => :through 是解决此问题的方法,它使用名为 Payments 的第三个模型来加入其他两个模型,并且在该模型内部有 user_id 和补偿 ID。我有以下设置:

class User < ActiveRecord::Base

has_many :payments
has_many :compensations, :through => :payments


class Compensation < ActiveRecord::Base

has_many :payments
has_many :users, :through => :payments

class Payment < ActiveRecord::Base

has_many :Users
has_many :compensations

我的第一个问题是:我是否正确,这是了解我想要实现的目标的最佳方法?我的第二个问题是在表单中包含一个下拉字段(从补偿表中汇集)以填充付款表的最简单方法是什么?不幸的是,我评论过的大多数关于 has_many :through 的网络讨论都集中在模型而不是视图上。

任何帮助将不胜感激。

【问题讨论】:

    标签: ruby-on-rails has-many-through


    【解决方案1】:
    class User < ActiveRecord::Base
     has_many :payments
     has_many :compensations, :through => :payments
    end
    
    class Compensation < ActiveRecord::Base
      has_many :payments
      has_many :users, :through => :payments
    end
    
    class Payment < ActiveRecord::Base
      belongs_to :user
      belongs_to :compensation
    end
    

    试试这个可能对你有帮助。 更多信息。看这个视频 - has_many->through

    【讨论】:

    • 谢谢。那是我的一个错误。我实际上看过那个视频,但不幸的是,在创建关系之后,它并没有指导我下一步使用视图让它发挥作用,或者至少我认为它没有。我再看看。
    【解决方案2】:

    目前还不清楚您的目标是什么。为什么用户会有很多补偿?为什么补偿会有很多用户,任何特定的补偿不会是针对特定用户的补偿?我也不确定你在第二个问题中所说的是什么形式。

    也就是说,假设您想要执行与上述代码类似的操作,您只需要:

    class User < ActiveRecord::Base
      has_and_belongs_to_many :compensations
    end
    
    class Compensation < ActiveRecord::Base
      has_and_belongs_to_many :users
    end
    

    至于下拉菜单,请查看 Rails select helpers。抱歉,我不能更具体,再说一遍,我不确定你要做什么。

    【讨论】:

    • 抱歉帖子不清楚。也许这会有所帮助,我可能使用了错误的方法。管理员为用户 A 分配了补偿,比如说 100 美元。此补偿将用于应用程序中的显示目的。两个月后,管理员将用户 A 的报酬增加到 200 美元。如果增加继续发生,我希望能够跟踪它们何时发生,并在给定时间能够显示它们发生的历史。我使用 has_many : through 因为我认为这是您想要保留历史数据时应该使用的方法。
    • 因为他们是数据库中的多个用户,我假设关系是 has_many 双向 --- 最后,我所指的表格是管理员用来设置补偿的表格在用户个人资料中。
    • 这个下拉列表中可能的值应该是什么,它们会因用户而异?
    • 我希望尽可能从补偿表中动态提取值。这些值对于应用程序的所有用户都是相同的,但显然不同的值会根据选择分配给不同的用户。
    【解决方案3】:

    我想通了——但朝另一个方向发展——现在我决定不再跟踪历史,并使用 collection_select 创建了一个动态下拉列表——

    【讨论】:

      【解决方案4】:

      您的第一个问题是:我是否正确,知道我要达到的目标是最好的方法吗? Ans:这是一个很好的方法,但你可以在那里“多态关联”以获得更具体的解决方案。 您的第二个问题是在表单中包含一个下拉字段(从补偿表中汇集)以填充付款表的最简单方法是什么?

      第二个问题不太清楚。是否要显示某个属性的值?

      如果是这样,请按照我的这个例子。我想它会帮助你。

      contact.select :contactable, @member.contacts.map {|r| [r.first_name,r.id] }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-13
        • 2020-04-07
        • 2023-04-11
        • 2012-11-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多