ror - включить внешний ключ на обоих концах has_many и own_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 не должно быть внешнего_ключа (я полагаю, что на него есть ссылка в own_to ok), но я не уверен, знаете ли вы?

то есть должно быть

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

person Michael Durrant    schedule 24.01.2012    source источник


Ответы (2)


Я думаю, вы пытаетесь сделать что-то, что уже запечено в Rails. Здесь вы должны использовать полиморфные ассоциации.

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

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

Таким образом, вам нужно объявить foreign_key ни на одной из сторон.

person ez.    schedule 24.01.2012
comment
Это тоже правда... Я просто пытался ответить на его вопрос, ха-ха. - person Batkins; 25.01.2012

В операторе has_many для рельсов :foreign_key действительно является опцией, которая имеет это описание в документация ActiveRecord:

Укажите внешний ключ, используемый для ассоциации. По умолчанию предполагается, что это имя этого класса в нижнем регистре с суффиксом «_id». Таким образом, класс Person, создающий ассоциацию has_many, будет использовать «person_id» в качестве значения по умолчанию :foreign_key.

Итак, в вашем случае похоже, что вам нужен атрибут foreign_key в вашем выражении has_many, поскольку он отличается от имени класса.

Однако вам не нужно объявление foreign_key в операторе belongs_to. Вот описание параметра :foreign_key для отношения belongs_to в документация ActiveRecord:

Укажите внешний ключ, используемый для ассоциации. По умолчанию предполагается, что это имя ассоциации с суффиксом «_id». Таким образом, класс, который определяет ассоциацию «member_to:person», будет использовать «person_id» в качестве значения по умолчанию :foreign_key. Аналогичным образом, created_to :favorite_person, :class_name => «Person» будет использовать внешний ключ «favorite_person_id».

Я предполагаю, что вы действительно хотели написать для своего класса Comment следующее:

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

В этом случае вы можете упростить оператор belongs_to до следующего:

belongs_to :graphic
person Batkins    schedule 24.01.2012
comment
Я думаю, что он действительно имеет в виду assets_id, который может быть графическим, а может и не быть. - person ez.; 25.01.2012
comment
Обе цитаты слишком похожи. Я не понимаю, почему :foreign_key переопределяется в модели с has_many, когда это модель с belongs_to, которая фактически будет иметь внешний ключ в своей таблице. - person Don Cheadle; 07.02.2015