Nie, nie są wymienne i istnieją pewne rzeczywiste różnice.
belongs_to
oznacza, że klucz obcy znajduje się w tabeli dla tej klasy. Tak więc belongs_to
może TYLKO iść w klasie, która posiada klucz obcy.
has_one
oznacza, że istnieje klucz obcy w innej tabeli, która odwołuje się do tej klasy. Tak więc has_one
może TYLKO przejść w klasie, do której odwołuje się kolumna w innej tabeli.
Więc to jest źle:
class Person < ActiveRecord::Base
has_one :cell # the cell table has a person_id
end
class Cell < ActiveRecord::Base
has_one :person # the person table has a cell_id
end
Więc to:
class Person < ActiveRecord::Base
belongs_to :cell # the person table has a cell_id
end
class Cell < ActiveRecord::Base
belongs_to :person # the cell table has a person_id
end
Dla stowarzyszenia dwukierunkowy, trzeba po jednym z każdego, a oni muszą iść we właściwym klasie. Nawet w przypadku stowarzyszenia jednokierunkowego ważne jest, którego z nich używasz.
jeden dobry [blog tutaj] (http://requiremind.com/differences-between-has-one-and-belongs-to-in-ruby-on-rails/) dla tego samego! –
Powyższy kod jest niepoprawny, powinien być 'has_one: cell' i' belongs_to: person' powinien ** nie ** być spacją między dwukropkiem a następnym słowem. – Josh