Удалить / пропустить несколько объектов из коллекции ActiveRecord_Relation в rails4 - PullRequest
0 голосов
/ 06 июня 2018

Если вы используете select!, Reject!, Delete_if для коллекции AR

@projects = Project.all (имеет 3 записи со значением столбца состояния 'fail')

@projects.reject!{|p| p.status=="failed"} (has 0 records now)

Но @projects.count=> выдача результата как 3 still

Значит Если мы попытаемся выполнить какие-либо запросы к @projects, которые все еще используют старую коллекцию (3 записи).

Есть предложения?почему он использует старую коллекцию, поскольку уже отфильтровал ее с помощью операции отклонения.и я не хочу, чтобы он использовал старую коллекцию AR.

Используя AR where, мы можем достичь этого, но в моем случае, использование только where не смогло бы достичь моего результата и потребовалась какая-то операция надКоллекция AR и должна возвращать AR только не Array.

1 Ответ

0 голосов
/ 06 июня 2018

Вам лучше использовать ActiveRecord::QueryMethods#where:

@project.where.not(status: :failed)

@projects.class вернет вам объект ActiveRecord::Relation, который не реализует метод reject!,таким образом, вы не можете «изменить» это, как вы пытаетесь.И в любом случае не будет смысла делать это.

РЕДАКТИРОВАТЬ: (так как ОП был отредактирован)

Я уверен, что ваша вещь может быть достигнута с помощью интерфейса запросов, нопоскольку вы не можете привести конкретный пример, вот неэффективный способ, но почему вы заботитесь об эффективности, верно?

project_ids = @projects.reject { |p| p.status == "failed" }.map(&:id)
new_at_collection = Product.where(id: project_ids)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...