ror - 在has_many和belongs_to的两端包含外键?

时间:2012-01-24 20:44:10

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

我正在继承具有以下代码的代码:

class Graphic < ActiveRecord::Base
  has_many :comments, :foreign_key => 'asset_id',  
  :conditions => 'asset_type_id = 5', 
  :order => 'created_at', :dependent => :destroy

class Comment < ActiveRecord::Base
  belongs_to :graphic, :foreign_key => :asset_id

在我看来,像has_many不应该有foreign_key(它在belongs_to中被引用,我相信)但是我不确定,你知道吗?

即。应该是

class Graphic < ActiveRecord::Base
  has_many :comments,  
  :conditions => 'asset_type_id = 5', 
  :order => 'created_at', :dependent => :destroy

class Comment < ActiveRecord::Base
  belongs_to :graphic, :foreign_key => :asset_id

2 个答案:

答案 0 :(得分:3)

在导言的has_many语句中,:foreign_key确实是一个选项,在ActiveRecord documentation中有此描述:

  

指定用于关联的外键。默认情况下,这被认为是小写的这个类的名称和后缀“_id”。因此,创建has_many关联的Person类将使用“person_id”作为默认值:foreign_key。

因此,在您的情况下,您似乎需要foreign_key语句中的has_many属性,因为它与类的名称不同。

但是,您的foreign_key声明中不需要belongs_to声明。以下是the ActiveRecord documentation:foreign_key关系belongs_to选项的说明:

  

指定用于关联的外键。默认情况下,这被认为是具有“_id”后缀的关联的名称。因此,定义belongs_to:person关联的类将使用“person_id”作为默认值:foreign_key。同样,belongs_to:favorite_person,:class_name =&gt; “Person”将使用“favorite_person_id”的外键。

我假设你真正想为你的Comment课写的是:

class Comment < ActiveRecord::Base
  belongs_to :graphic, :foreign_key => :graphic_id

在这种情况下,您可以将belongs_to语句简化为:

belongs_to :graphic

答案 1 :(得分:3)

我认为你正在尝试做一些已经在Rails中出现的东西。您应该在这里使用多态关联。

class Comment
  belongs_to :asset, :polymorphic => true
end

class Graphic
  has_many :comments, :as => :assets
end

这样,你需要在任何一方都声明foreign_key。