Установите значение attr_accessor в ActiveRecord Relation

У меня есть ActiveRecord Relation, из которого я хотел бы установить атрибут не сохраняется. К сожалению, это не работает.

Я думаю, что лучший способ увидеть проблему - это просто увидеть код:

class Post < ActiveRecord::Base
  attr_accessor :search
end

В моем контроллере у меня есть:

results.where(id: search_posts).each do |result_out_of_search|
  result_out_of_search.search = true
end
results.where(id: search_posts).first.search #returns nil

заранее спасибо

2 ответа

Решение

Причина, по которой вы не видите свой search атрибуты как истина, потому что вы получаете сообщения снова при втором вызове. Как вы говорите, атрибут не сохраняется, поэтому вам нужно убедиться, что вы работаете с одной и той же коллекцией сообщений. Если вы запускаете свой код в консоли или просматриваете журналы с сервера, вы увидите, что запрос на выборку запускается дважды.

Чтобы убедиться, что вы используете одну и ту же коллекцию, вам нужно отслеживать ее явно, а не делать results.where(...) снова:

posts = results.where(id: search_posts)
posts.each do |result_out_of_search|
  result_out_of_search.search = true
end
posts.first.search # Should be true

Если вы просто декорируете результаты поиска, вы также можете получить некоторую ценность от драгоценного камня, подобного draper, который очень красиво воплощает эту идею.

Попробуй это

results = results.where(id: search_posts)

results.each do |result_out_of_search|
  result_out_of_search.search = true
end

results.first.search

Вы должны сначала загрузить записи в память. Как results.where(id: search_posts) приводит к запросу БД, это не то, что вы хотите. Вам нужно загрузить в память, а затем извлечь его из памяти.

Другие вопросы по тегам