是否存在与belongs_to相似的不同关联?

时间:2013-08-05 19:46:25

标签: ruby-on-rails ruby-on-rails-3 activerecord

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

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

我还有其他选择吗?

2 个答案:

答案 0 :(得分:1)

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

基本上,您将要设置一个中间模型来加入您的歌曲和主题模型,而不会明确属于另一个。假设你创建一个“Assignment”模型来处理这个问题,你的模型会说:

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进行分配,这样您就可以随时查询Assignments表,其中theme_id / song_id = x可以检索相关记录。希望这种方法足够灵活,可以做你想做的事情。

答案 1 :(得分:0)

关于使用其他名称进行关联定义:否。

Rails是一个固定的框架,按设计 - convention over configurationbelongs_to是其设计者在DSL模型/关联描述中为此概念选择的关键字,您应该尝试习惯使用它。请记住,您所写的内容仍然是代码;只是因为很多Ruby / Rails读起来像英语,这并不意味着英语,并且关键词并不总是与它们看起来的英文单词具有相同的含义。

别名belongs_to和其他关联宏theoretically possible,但你真的不应该这样做。如果其他人不得不使用它,将会损害您的代码的可读性。