У меня есть следующие модели в Rails 4 с простым has_many: через объединение:
class Model < ActiveRecord::Base
has_many :model_options
has_many :options, through: :model_options
end
class Option < ActiveRecord::Base
has_many :model_options
has_many :models, through: :model_options
end
class ModelOption < ActiveRecord::Base
belongs_to :model
belongs_to :option
end
Я хочу иметь возможность выполнять итерацию над экземпляром экземпляра Model:
model = Model.find.first
model.options.each {}
и получить доступ к атрибутам в таблице соединений.
В Rails 3 вы можете сделать это:
class Model < ActiveRecord::Base
has_many :model_options
has_many :options, through: :model_options , select: 'options.*, model_options.*'
end
Но выберите: устарел, и это вызывает предупреждение об отказе.
Тем не менее, сгенерированный SQL содержит данные таблицы ссылок:
SELECT options.*, model_options.* FROM "options"
INNER JOIN "model_options" ON "options"."id" = "model_options"."option_id"
WHERE "model_options"."model_id" = $1 ORDER BY "options".name ASC [["model_id", 1]]
Но коллекция, возвращенная AR из model.options, удаляет данные таблицы ссылок.
Чтобы удалить предупреждение об изъятиях в Rails 4 и все равно произвести тот же SQL, я сделал следующее:
class Model < ActiveRecord::Base
has_many :model_options
has_many :options, -> { select('options.*, model_options.*') }, through: :model_options
end
Итак, запрос верный, но я изо всех сил стараюсь найти правильный способ доступа к данным таблицы ссылок.
Я пробовал разные способы:
model options
model.options.joins(:model_options)
model.options.select('options.*, model_options.*')
model.model_options.joins(:option)
...
Ни один из них не содержит данные таблицы соединений.
Спасибо.