2014-09-30 2 views
0

Существует customer таблицы со столбцами id, name и email, а также address таблицы со столбцами id, street, code, customer_id.Регистрации нормированной таблицы с активной записью

В SQL Присоединяюсь как с помощью:

SELECT c.id, c.name, c.email, a.street, a.code FROM customer AS c, address AS a WHERE a.customer_id = c.id; 

В Rails Я смоделировал:

class Address < ActiveRecord::Base 
    self.table_name = 'address' 
end 
class Customer < ActiveRecord::Base 
    self.table_name = 'customer' 

    has_one :address 
end 

В контроллере я попытался:

  • Customer.joins(:address) =>SELECT customer.* FROM customer INNER JOIN address ON address.customer_id = customer.id
  • Customer.includes(:address) =>SELECT customer.* FROM customer; SELECT address.* FROM address WHERE address.customer_id IN (1, 2)

Однако оба результата не возвращают ожидаемый результат.

Как получить те же результаты, что определены в первом SQL-запросе или как это сделать?

ответ

1

Это не совсем так, но я понимаю, откуда вы пришли, изучив Rails после много работы с БД. Запустите консоль, чтобы проверить эти идеи. Во-первых, адрес правильно «принадлежит» клиенту. Клиент имеет адрес «has_one». они определены в модели. Подумайте о модели как таблице базы данных. Внешние ключи определяются указанными вами отношениями. Соединение интерпретируется отношением.

Итак, в консоли создайте адрес.

> Address.create(:street => "123 Main") 

На выходе будет отображаться идентификатор нового адреса. Создайте запись клиента, а в столбце address_id введите идентификатор адреса.

Customer.create(:address_id=> [ new address id ]) 

Запрос клиента:

> customer = Customer.find([id number]) 

Затем введите

> customer.address 

Он должен показать вам адрес. Никаких объединений не требуется (но они происходят на сервере).

И вам не нужно указывать имена таблиц в модели.

+0

Спасибо! Знаете ли вы, что ActiveRecord использует ленивую загрузку, и из-за этого иногда может скрывать свойства? – bodokaiser

+0

Добро пожаловать! Что вы подразумеваете под скрытыми свойствами? Я верю, что ленивая загрузка происходит с «нетерпеливой» загрузкой. –

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