与不属于任何东西的对象创建has_one关联

时间:2014-03-25 01:53:59

标签: ruby-on-rails activerecord

我会马上承认,我是Rails的新手,但不是一般的编程或任何东西。

我跟着Michael Hartl's tutorial并对他在安全和受控空间中的工作方式有了一个很好的理解,但现在我已经在现实世界中遇到了一些问题。

我正在努力学习这个东西的小项目是一个非常简单的rails应用程序,用户可以将歌曲添加到数据库并将其标记为“最喜欢的”轨道。虽然歌曲是由用户上传的,但它们并非由用户拥有,因为任何其他用户都可以选择之前上传的歌曲以标记为“最喜欢的”。

所以对我来说有意义的是用户模型

has_one :song
validates :song_id, presence: true

并且对于没有关联规则的歌曲模型,因为歌曲不属于用户,所以它属于整个应用程序,供任何用户选择作为他们的最爱。

然而,当我在rails控制台中尝试此操作并尝试执行user.song时会抛出错误:

ActiveRecord::StatementInvalid: SQLite3::SQLException: no such column: songs.user_id: 

SELECT  "songs".* FROM "songs"  WHERE "songs"."user_id" =
?  ORDER BY "songs"."id" ASC LIMIT 1

我可以看到它正在尝试做什么,它解释了我所说的意思,歌曲模型有一个user_id列来加入用户表,但我想要的是相反的。我阅读了文档,发现belongs_to关联正好相反,所以我把它扔进了用户模型,而不是这样:

belongs_to :song
validates :song_id, presence: true

这实际上有效!但是......它没有任何意义。用户不应该属于任何人,它应该有一首喜欢的歌曲。此外,说歌曲对象has_many用户也没有意义,因为用户(如歌曲)并非真正被任何人“拥有”,这是推文由用户拥有的方式,让我们说

我的意思是,如果这是这样做的方式(让用户属于歌曲,并且歌曲有很多用户)我很好,那对我来说真的没有意义,因为我' Rails的新手我认为这可能是一种更好的方法,这在模型的代码中更有意义。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

简短的回答是,这是Rails的方法。

:belongs_to和:has_one谓词都是1-1关系,区别主要是关于主键引用所在的对象链接两个对象的指示。使用它的自然选择通常不在于关系是否实际上更像是1对多或多对1。

:belongs_to表示密钥引用是本地的。这通常在使用组合物时使用;如果你有一个柜子的架子,每个架子属于'一个内阁,内阁将会有一个' has_many'货架对象。关键是在架子上,因为这是很多的对象。

:has_one表示关键引用位于对方对象上。如果它也可以使用它:has_many反对对象。

在你的情况下,你想象将这段关系描述为歌曲:has_many仰慕者,每一个:属于歌曲(作为崇拜者,通过最喜欢的关系)。

http://guides.rubyonrails.org/association_basics.html通过许多示例提供了更好的概述,包括许多关系。