У меня есть объект ActiveRecord, основанный на сложном наборе объединений, слияний и предложений where. Он использует оператор .select
для создания списка объектов с различными идентификаторами объектов, которые мне нужно извлечь из базы данных. Псевдокод ниже демонстрирует: (это упрощено с целью сделать вопрос понятным)
list = Foo.joins(:bar).... <etc> ...select("foos.id as foo_id", "bars.id as bar_id")
list.each do |item|
foo = Foo.find(item.foo_id)
bar = Bar.find(item.bar_id)
... <do something with foo and bar>
end
, поэтому list
- это массив Foos с добавленными атрибутами и аксессорами для :foo_id
и :bar_id
, Что я хотел бы сделать, так это избежать необходимости извлекать foo
и bar
в l oop. Поэтому я пытаюсь выяснить, как создать list
таким образом, чтобы я мог сделать следующее:
list.each do |item|
foo = item.foo
bar = item.bar
... <do something with foo and bar>
end
Я думаю, мне нужно создать новый объект с соответствующими ассоциациями:
class ThingGetter < ApplicationRecord
belongs_to :foo
belongs_to :bar
def self.list
Foo.joins(:bar).... <etc> ...select("foos.id as foo_id", "bars.id as bar_id")
end
end
ThingGetter.list.each do |item|
foo = item.foo
bar = item.bar
... <do something with foo and bar>
end
Это близко, но список по-прежнему состоит из Foo
с вместо ThingGetter
с, поэтому я не могу использовать ассоциации. Как сделать, чтобы list возвращал объект ActiveRecord со списком ThingGetter
s?