我有一个ActiveRecord关系,我想从中设置一个不持久的属性。不幸的是,它没有用。
我认为看到问题的最好方法就是看代码:
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
提前致谢
答案 0 :(得分:3)
试试这个
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)
会导致数据库查询,因此不是您想要的。您需要加载到内存,然后从内存中检索它。
答案 1 :(得分:3)
您没有看到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这样的宝石中获得一些价值,它很好地包含了这个想法。