如何为用户创建has_many对象,但每个对象都可以属于多个用户?

时间:2014-01-04 04:50:11

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

我是Ruby的新手,我开始为自己构建一个应用程序,以便在我去的时候学习 对不起,如果这是一个非常简单的问题,但我似乎无法弄清楚我可以对关联进行的所有搜索。

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

经过一番搜索后,我决定使用has_many:通过关系,我创建了第三个名为collection的模型:

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的has_many有可能has_many回A或者那只是疯了吗?这是一个愚蠢的问题吗?

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

1 个答案:

答案 0 :(得分:0)

在问题的前半部分,您可以准确描述所需的解决方案。你已经做好了一切。

想象一下,您有两个用户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或其他什么东西,以便更有意义?