ror - включить внешний ключ на обоих концах has_many и own_to? - PullRequest
4 голосов
/ 25 января 2012

Я наследую код, который имеет:

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 (на него есть ссылка в bound_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

Ответы [ 2 ]

3 голосов
/ 25 января 2012

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

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

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

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

3 голосов
/ 25 января 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.Таким образом, класс, который определяет ассоциацию own_to: person, будет использовать «person_id» по умолчанию: foreign_key.Аналогично, own_to: favourite_person,: class_name => "Person" будет использовать внешний ключ "fav__person_id".

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

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

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

belongs_to :graphic
...