Как объединить несколько таблиц с однозначным отношением в рельсах - PullRequest
2 голосов
/ 25 июня 2009

Ruby on Rails для меня очень новый. Я пытаюсь получить набор столбцов из 3 разных таблиц. Я думал, что смогу использовать представление SQL для получения своих результатов, но не смог найти способ использовать представления в Rails. Вот мои столы. 1) Таблица пользователей -> имя пользователя, пароль и адрес электронной почты 2) Таблица UserDetails -> внешний ключ: user_id, имя, адрес1, город и т. Д. 3) UserWorkDetails -> внешний ключ: user_id, рабочий адрес1, тип работы и т. Д.

Эти 3 таблицы имеют отношения один к одному. Таким образом, таблица 2 принадлежит таблице 1, а таблица 3 также принадлежит таблице 1. Таблица 1 имеет один пользовательский и один пользовательский детали.

Я хочу получить электронную почту пользователя, имя, адрес1, город, рабочий адрес1, тип работы с помощью объединений.

Как лучше всего справиться с этим?

Ответы [ 3 ]

4 голосов
/ 25 июня 2009

Данные есть (есть) в моделях. Все остальное - просто оптимизация. Так, например, адрес1 находится на user.user_detail.address1.

если у вас есть

class User
  has_one :user_detail
  has_one :user_work_detail
end
class UserDetail
  belongs_to :user
end
class UserWorkDetail
  belongs_to :user
end

С user_id столбцами в таблицах с именами user_details и user_work_details, все остальное сделано за вас. Если вам позже потребуется оптимизировать, вы можете: включить собственные модели, но это не обязательно для того, чтобы все работало.

2 голосов
/ 25 июня 2009

Чтобы быстро получить то, что вы хотите, используйте опцию: include, чтобы включить обе другие таблицы при запросе первичной таблицы, поэтому:

some_user_details = User.find(some_id, :include => [:user_details, :user_work_details])

При этом сразу будут загружены все поля из таблиц, поэтому выполняется только один запрос, а затем вы можете делать с объектами все, что вам нужно, поскольку они будут содержать все пользовательские данные.

Я считаю, что это достаточно просто и достаточно, и с этим вы не оптимизируете слишком рано, прежде чем узнаете, где находятся узкие места.

Однако, если вы действительно хотите просто загрузить обязательные поля, используйте также опцию: select в ActiveRecord :: Base find метод:

some_user_details = User.find(some_id, :include => [:user_details, :user_work_details], :select => "id, email, name, address1, city, work_address1")

Хотя мой SQL немного устарел.

0 голосов
/ 25 июня 2009

User.find(:first, :joins => [:user_work_details, :user_details], :conditions => {:id => id})

Я бы сказал, что попытка просто выбрать нужные поля на данном этапе является преждевременной оптимизацией, но вы можете сделать это сложным путем: выберите хеш.

:include сделает 3 выбора, 1 для пользователя, один для user_details и один для user_work_details. Отлично подходит для выбора коллекции объектов из нескольких таблиц в минимальных запросах.

http://apidock.com/rails/ActiveRecord/Base/find/class

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...