2009-05-13 2 views

Antwort

2

Sie sollten die Option :foreign_key auf beide setzen.

Betrachten Sie die folgenden zwei Modelle:

class Article < ActiveRecord::Base 
    has_many :comments, :foreign_key => "articleID" 
end 

class Comment < ActiveRecord::Base 
    belongs_to :article, :foreign_key => "articleID" 
end 

has_many in der Article Klasse Deklarieren ermöglicht es Ihnen, zu tun:

Article.find(12).comments # Finds all comments with comment.articleID == 12 

Die belongs_to Methodenaufruf im Comment Modell ermöglicht:

Comment.last.article  # Finds article with article.id == comment.articleID 

Wie Sie kann sehen, in beiden Fällen wird der Fremdschlüssel verwendet. Wenn dieser Pfad an keiner Stelle ausgelassen wird, funktioniert dieser bestimmte Assoziations-Proxy nicht ordnungsgemäß.

+0

Sie müssen * immer * nicht die Option ': foreign_key' auf beiden Optionen setzen. In Ihrem speziellen Beispiel tun Sie das, weil Sie einen älteren Spaltennamen haben. Dieses Problem tritt jedoch häufig auf, wenn Sie nur eine Zuordnung umbenennen, z. B. 'gehört_zu: default_account,: klassenname =>" Konto ",: Fremdschlüssel =>" account_id "'. Das entsprechende 'has_one' in der Account-Klasse muss den Fremdschlüssel nicht angeben. –

2

belongs_to erraten, dass der Fremdschlüssel der Name der Assoziation plus _id ist.

has_one erraten, dass der Fremdschlüssel der Name der enthaltenen Klasse plus _id ist.

In der Regel für einen nicht standardmäßigen Schlüssel, brauchen Sie es nur an einem Ort.

class Book < ActiveRecord::Base 
    # Rails default fk is isbn_id 
    belongs_to :isbn, :class_name => "BarCode", :foreign_key => "bar_code_id" 
end 

class BarCode < ActiveRecord::Base 
    # Rails default fk is bar_code_id, so you don't need to specify it 
    has_one :book 
end