Ответ 1
Ответ может отличаться от того, что вы хотите достичь. Вы хотите получить эти атрибуты или использовать их для запросов?
Загрузка результатов
ActiveRecord - это сопоставление строк таблицы с объектами, поэтому вы не можете иметь атрибуты из одного объекта в другой.
Позвольте использовать более конкретный пример: есть Дом, Личность и Собака. Человек принадлежит к дому. Собака принадлежит человеку. В доме много людей. В доме много собак через людей.
Теперь, если вам нужно найти собаку, вы не ожидаете наличия в ней персональных атрибутов. Было бы бессмысленно иметь атрибут car_id в атрибутах собаки.
Говоря это, это не проблема: вы действительно хотите, я думаю, избегать создания большого количества запросов db. У Rails ваша спина:
# this will generate a sql query, retrieving options and model_options rows
options = model.options.includes( :model_options )
# no new sql query here, all data is already loaded
option = options.first
# still no new query, everything is already loaded by `#includes`
additional_data = option.model_options.first
Изменить: он будет вести себя как консоль. В самом деле код приложения sql-запрос будет запущен во второй команде, потому что первый не использовал результат (запрос sql запускается только тогда, когда нам нужны его результаты). Но это ничего не меняет: он запускается только один раз.
#includes
делает именно это: загрузка всех атрибутов из внешней таблицы в результирующем наборе. Затем все отображается, чтобы иметь осмысленное объектно-ориентированное представление.
Использование атрибутов в запросе
Если вы хотите сделать запрос на основе параметров и ModelOptions, вам нужно будет использовать #references
. Скажем, ваш ModelOption имеет атрибут active
:
# This will return all Option related to model
# for which ModelOption is active
model.options.references( :model_options ).where( model_options: { active: true })
Заключение
#includes
будет загружать все внешние строки в наборе результатов, чтобы вы могли использовать их позже, без дальнейшего запроса базы данных. #references
также позволит вам использовать таблицу в запросах.
В любом случае у вас есть объект, содержащий данные из другой модели, но это хорошо.