Преобразование массива объектов в ActiveRecord:: Relation
у меня есть массив объектов, назовем это Indicator. Я хочу запустить методы класса индикатора (те из def self.subjects разнообразие, области и т. д.) На этом массиве. Единственный способ, которым я знаю, чтобы запустить методы класса на группе объектов, чтобы они были ActiveRecord:: Relation. Поэтому я в конечном итоге прибегаю к добавлению to_indicators метод Array.
def to_indicators
# TODO: Make this less terrible.
Indicator.where id: self.pluck(:id)
end
иногда я цепочку довольно много из этих областей, чтобы отфильтровать результаты, в пределах методов класса. Итак, даже если я вызываю метод на ActiveRecord:: отношение, я не знаю, как получить доступ к этому объекту. Я могу добраться до его содержимого только через all. Но all - это массив. Поэтому я должен преобразовать этот массив в ActiveRecord:: Relation. Например, это часть одного из методов:
all.to_indicators.applicable_for_bank(id).each do |indicator|
total += indicator.residual_risk_for(id)
indicator_count += 1 if indicator.completed_by?(id)
end
Я думаю, что это сводится к двум вопросам.
- как я могу преобразовать массив объектов в ActiveRecord:: Relation? Желательно без
whereкаждый время. - при выполнении
def self.subjectsвведите метод на ActiveRecord::Relation, как мне получить доступ к самому объекту ActiveRecord:: Relation?
спасибо. Если мне нужно что-то прояснить, дайте мне знать.
3 ответов:
как я могу преобразовать массив объектов в ActiveRecord:: Relation? Желательно не делать каждый раз.
вы не можете преобразовать массив в ActiveRecord:: Relation, поскольку отношение является просто построителем для SQL-запроса, а его методы не работают с фактическими данными.
однако, если то, что вы хотите, это отношение, то:
для ActiveRecord 3.x, не звони
allи вместо вызоваscoped, который вернет отношение, которое представляет те же записи, чтоallдаст вам в массив.для ActiveRecord 4.х, просто позвоните
all, который возвращает отношения.при выполнении
def self.subjectsвведите метод на ActiveRecord::Relation, как мне получить доступ к самому объекту ActiveRecord:: Relation?когда метод вызывается по отношению объект,
self- это отношение (в отличие от класса модели, в котором оно определено).
вы можете конвертировать массив объектов
arrк ActiveRecord:: отношение, как это (предполагая, что вы знаете, какой класс объекты, которые вы, вероятно, делаете)MyModel.where(id: arr.map(&:id))вы должны использовать
whereхотя, это полезный инструмент, который вы не должны быть неохотно используют. И теперь у вас есть однострочное преобразование массива в отношение.
map(&:id)превратит Ваш массив объектов на массив, содержащий только их идентификаторы. И передача массива в предложении where будет создать инструкцию SQL сINэто выглядит примерно так:SELECT .... WHERE `my_models`.id IN (2, 3, 4, 6, ....имейте в виду, что порядок массива будет потерян - но так как ваша цель состоит только в том, чтобы запустить метод класса на коллекция из этих объектов, я предполагаю, что это не будет проблемой.
Ну, в моем случае, мне нужно преобразование массива объектов в ActiveRecord:: Relation а также сортировка их с определенным столбцом (id например). Так как я использую MySQL, то может быть полезным.
MyModel.where('id in (?)',ids).order("field(id,#{ids.join(",")})")SQL выглядит так:
SELECT ... FROM ... WHERE (id in (11,5,6,7,8,9,10)) ORDER BY field(id,11,5,6,7,8,9,10)
Comments