ActiveRecord has_many
und belongs_to
Methoden beide nehmen eine :foreign_key
Option. Wenn ich es verwenden muss, um einen nicht standardmäßigen FK-Spaltennamen zu behandeln, sollte ich es für das übergeordnete Modell (has_many
), das untergeordnete Modell (belongs_to
) oder beides festlegen, oder spielt es eine Rolle?Für eine ActiveRecord-Eins-zu-viele-Verknüpfung, die: Foreign_key-Option sollte ich festlegen?
1
A
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äß.
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
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. –