рельсы принадлежат has_one. нужно какое-то объяснение - PullRequest
3 голосов
/ 23 января 2010

У меня есть две модели:

Customer и Contact

Customers таблица содержит столбцы :id, :firstName, :lastName

Contacts таблица содержит столбцы :id, :cid, :hphone, :cphone

То есть, если в таблице «Клиенты» есть данные

1  Josh   McDonnel

Тогда таблица контактов имеет соответствующий

5   1   947-245-2342 342-543-8585 

Какие ассоциации я могу использовать здесь?

будет иметь контакт

belongs_to :customer, :foreign_key => "id", :class_name => "Customer"

Что должен иметь класс Customer?

Кроме того, как будет выглядеть простой find_byXXX, если я хочу получить всех клиентов (firstName, lastName и соответствующие hphone и cphone)

Ответы [ 3 ]

8 голосов
/ 23 января 2010

помните одно правило: Таблица с внешним ключом принадлежит_ к таблице, на которую ссылается этот внешний ключ.

4 голосов
/ 23 января 2010

Вы близки, но ваш belongs_to должен быть таким. :foreign_key должно быть именем поля, хранящего ссылку на первичный идентификатор:

belongs_to :customer, :foreign_key => "cid"

А в вашем Customer.rb классе:

has_one :contact, :foreign_key => "cid"

Наконец, ваш поиск может выглядеть следующим образом:

@customers = Customer.all(:include => :contact)

Тогда вы могли бы использовать это в цикле в вашем представлении:

<% @customers.each do |customer| %>
   <p>Name: <%= customer.firstName %> <%= customer.lastName %></p>
   <p>Home: <%= customer.contact.hphone %></p>
   <p>Work: <%= customer.contact.cphone %></p>
<% end %>

Между прочим , если бы вы использовали customer_id вместо cid, ваша ассоциация могла бы просто быть:

#Contact.rb
belongs_to :customer

#Customer.rb
has_one :contact
1 голос
/ 23 января 2010

Объект, в таблице которого содержится внешний ключ «own_to», объекта, которого нет.

Если у Клиента есть контакт и Контакт принадлежит ему, то в таблице контактов будет существовать внешний ключ (по умолчанию "идентификатор клиента")

Вы, вероятно, не хотите использовать «id» в качестве внешнего ключа, поскольку «id» зарезервировано для столбца, содержащего идентификатор контакта. Указывать имя класса также не требуется, поскольку имя класса совпадает с именем отношения (в данном случае, «customer»).

Клиент будет иметь:

has_one :contact

Контакт будет иметь:

belongs_to :customer

Тогда, если вы хотите найти контакт с определенным клиентом, вы можете просто позвонить:

@customer.contact

или наоборот.

Ваш другой вопрос относительно find_by_XXX немного расплывчатый. Если вы хотите найти всех клиентов с именем «Джон», вы можете использовать:

@customers_named_john = Customer.find_by_firstName("John")

Но я не уверен, что вы об этом спрашиваете.

...