Ruby on rails 创建一个与一个不';我不属于任何东西

Ruby on rails 创建一个与一个不';我不属于任何东西,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我马上就承认,我对Rails是新手,但对一般编程或任何东西都不熟悉 我跟着他,对他安全可控的空间里的东西是如何工作的有了相当好的理解,但现在我在现实世界中遇到了一些问题 我正在进行的一个学习这些东西的小项目是一个非常简单的rails应用程序,用户可以在数据库中添加一首歌曲,并将其标记为他们“最喜欢”的曲目。虽然歌曲是由用户上传的,但它们并不属于用户,因为任何其他用户都可以选择以前上传的歌曲作为他们的“最爱” 因此,对我来说有意义的是用户模型 has_one :song validates :so

我马上就承认,我对Rails是新手,但对一般编程或任何东西都不熟悉

我跟着他,对他安全可控的空间里的东西是如何工作的有了相当好的理解,但现在我在现实世界中遇到了一些问题

我正在进行的一个学习这些东西的小项目是一个非常简单的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列来加入users表,但我想要的是相反的。我阅读了文档,发现
属于_to
关联的作用正好相反,因此我将其加入到用户模型中,如下所示:

belongs_to :song
validates :song_id, presence: true
这确实有效!但是这没有任何意义。用户不应该属于任何人,它应该有一首喜爱的歌曲。此外,说song对象
有很多用户也是没有意义的,因为用户像歌曲一样,并不是真的被任何人“拥有”,就像推特被用户拥有一样

我的意思是,如果这是实现这一点的方法(让用户属于歌曲,让歌曲拥有多个用户),我同意这一点,但这对我来说真的没有意义,因为我是Rails新手,我想可能有更好的方法来实现这一点,在模型的代码中更有意义


谢谢你的帮助

简单的回答是,这是Rails的方法

:allown_to和:has_one谓词都是1-1关系,区别主要在于主键引用位于哪个对象上以链接这两个对象。使用哪种关系的自然选择往往取决于关系实际上可能更像一对多还是多对一

:归属于表示密钥引用是本地的。这在使用构图时经常使用;比如说,如果你在一个柜子里有架子,每个架子“属于”一个柜子,这个柜子会“有很多”架子对象。钥匙在架子上,因为架子上有很多钥匙

:has_one表示键引用位于相反的对象上。如果可能的话,它经常被使用:has_许多相反的对象

在你的例子中,你可以想象将这种关系描述为一首歌:拥有许多仰慕者,每个人都属于这首歌(作为仰慕者,通过“最爱”的关系)


通过许多示例提供了更好的概述,包括许多关系。

我明白了,谢谢。我想我正忙于“所有权”这件事,因为我不想让用户对歌曲或其他东西“屈从”,但我想当你把它当作你描述的仰慕者类型的对象(碰巧是用户)来看待时,这才更有意义。谢谢你的帮助!