【问题标题】:How can I make a user has_many objects but each object can belong_to MANY users?如何让用户拥有_many 个对象,但每个对象都可以属于_多个用户?
【发布时间】:2014-01-04 04:50:10
【问题描述】:

我对 Ruby 很陌生,我开始为自己构建一个应用程序,只是为了边走边学。
抱歉,如果这是一个非常简单的问题,但我似乎无法通过我可以对关联进行的所有搜索来弄清楚。

因为我喜欢收集黑胶唱片,所以我希望建立一个用户可以发布他们收藏的黑胶唱片的网站。我从我的用户模型和乙烯基模型之间的简单 has_many/belongs_to 关联开始。我意识到,如果两个用户拥有相同的黑胶唱片,那么第二个用户最好只找到之前上传的一个并将其添加到他们的收藏中(而不是在数据库中有一堆重复的)。

经过一番搜索,我决定建立一个 has_many :through 关系,我在其中创建了第三个模型,称为 collections,它具有:

belongs_to :user
belongs_to :vinyl

所以现在我的乙烯基模型有

has_many :collections
has_many :users, through: :collections

我的用户模型有

has_many :collections
has_many :vinyls, through: :collections

但是,在 sqlite 浏览器中查看时,似乎每个“集合”最终都只有一个 user_id 和一个vinyl_id。显然,我需要每个“集合”都有一个很长的 user_id 列表。

有没有更简单的方法可以做到这一点? 是否可以只将 collection.rb 变成以下?

has_many :users
belongs_to :vinyl

A 是否有可能拥有 B 的多个和 B 拥有 A 的多个背面,或者这只是疯了?这是一个愚蠢的问题吗?

当然,我将不得不对我的控制器和视图进行大量修改,但我只想确保首先以正确的方式设置数据库。谢谢大家的帮助!

【问题讨论】:

    标签: ruby-on-rails ruby associations has-many belongs-to


    【解决方案1】:

    在问题的前半部分,您准确地描述了您需要的解决方案。你做对了一切。

    假设您有两个用户 A 和 B,以及三个记录 X、Y 和 Z。 用户 A 有记录 Y,用户 B 有记录 Z ...但两者都有记录 X。

    你创建你的用户:

    a = User.create # id: 1
    b = User.create # id: 2
    

    还有你的记录:

    x = Record.create # id: 1
    y = Record.create # id: 2
    z = Record.create # id: 3
    

    然后你建立你的关联:

    a.records << y
    a.records << x
    b.records << x
    b.records << z
    

    此结果是您的collections 表中的 4 行:

    id | user_id | record_id
    ------------------------
    1  | 1       | 2           # user A, record Y
    2  | 1       | 1           # user A, record X
    3  | 2       | 1           # user B, record X
    4  | 2       | 3           # user B, record Z
    

    这就是连接表的工作方式。它将每个用户连接到它的所有记录,并将每条记录连接到它的所有用户。

    这允许您执行User.first.recordsRecord.first.users 之类的操作

    你在正确的轨道上......继续前进,它会开始点击。也许将您的连接表和模型从 collections 重命名为 RecordOwnerships 或其他更有意义的名称?

    【讨论】:

    • 感谢您的解释!现在更有意义了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-12
    • 2019-12-21
    相关资源
    最近更新 更多