0

我是 Rails 新手,我正在尝试将默认歌曲与主题相关联。问题是如果我给主题一个 default_song_id 属性,我只能通过调用 default_song 直接访问这首歌,如果我让主题属于歌曲。

我的问题基本上只是协会的名称。主题显然不属于我的模型层次中的歌曲,歌曲的属性已经太多了。给歌曲一个 theme_id 属性是没有意义的,因为歌曲涉及到很多其他的关系,它实际上只是关心一首特定歌曲的主题,而且一首歌曲可以被多个主题引用。

那么我还有其他选择吗?

4

2 回答 2

1

听起来好像 'has_many :through' 关联可能是您正在寻找的。这里有一个很好的贯穿:http: //guides.rubyonrails.org/association_basics.html

从本质上讲,您需要设置一个中间模型来加入您的歌曲和主题模型,而不需要明确地属于另一个。假设您创建了一个“分配”模型来处理此问题,您的模型会说:

class Song < ActiveRecord::Base
  has_many :assignments
  has_many :themes, through: :assignments
end

class Theme < ActiveRecord::Base
  has_many :assignments
  has_many :songs, through: :assignments
end

class Assignment < ActiveRecord::Base
  belongs_to :song
  belongs_to :theme
end

对于每个配对,您都有一个带有 theme_id 和 song_id 的作业,因此您始终可以查询其中 theme_id/song_id = x 的作业表以检索任一关联记录。希望这种方法足够灵活,可以做你想做的事情。

于 2013-08-05T20:19:15.407 回答
0

至于为关联定义使用另一个名称:否。

Rails 是一个固执己见的框架,按照设计约定优于配置是其设计者在模型/关联描述的DSLbelongs_to中为此概念选择的关键字,您应该尝试习惯使用它。请记住,您正在编写的仍然是代码;仅仅因为很多 Ruby/Rails 读起来像英语,这并不意味着它英语,而且关键字并不总是与它们看起来的英语单词具有相同的含义。

理论上可以别名belongs_to和其他关联宏,但你真的不应该。如果其他人不得不使用它,它将损害您代码的可读性。

于 2013-08-05T20:17:09.300 回答