2012-01-24 4 views
3

Я наследование код, который имеет:ror - включить внешний ключ на обоих концах has_many и принадлежит_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 

ответ

3

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

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

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

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

+0

Это правда тоже ... Я просто пытался ответить на его вопрос ха-ха. – Batkins

3

В has_many заявлении для рельсов, :foreign_key действительно вариант, который имеет такое описание в ActiveRecord documentation:

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

Так что в вашем случае, это выглядит, как если бы вам нужно атрибут foreign_key на вашем has_many заявление, так как оно отличается от имени класса.

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

Укажите внешний ключ, используемый для объединения. По умолчанию предполагается, что это имя ассоциации с суффиксом «_id». Таким образом, класс, который определяет ассоциацию belongs_to: person, будет использовать «person_id» как значение по умолчанию: foreign_key. Аналогично, belongs_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 
+0

Я думаю, что он действительно означает asset_id, который может быть или не быть графическим –

+0

Две цитаты слишком похожи. Я не понимаю, почему ': foreign_key' переопределяется в Модели с' has_many', когда это модель с 'own_to', которая фактически будет иметь внешний ключ в своей таблице. – mmcrae

 Смежные вопросы

  • Нет связанных вопросов^_^