Преобразование массива объектов в 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


Я думаю, что это сводится к двум вопросам.




  1. как я могу преобразовать массив объектов в ActiveRecord:: Relation? Желательно без where каждый время.

  2. при выполнении def self.subjects введите метод на ActiveRecord::Relation, как мне получить доступ к самому объекту ActiveRecord:: Relation?


спасибо. Если мне нужно что-то прояснить, дайте мне знать.

643   3  

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)

функция поля MySQL

Comments

    Ничего не найдено.