在ActiveRecord Relation上设置attr_accessor值

时间:2015-11-16 12:12:43

标签: ruby-on-rails ruby-on-rails-4 activerecord attr-accessor activerecord-relation

我有一个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

提前致谢

2 个答案:

答案 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这样的宝石中获得一些价值,它很好地包含了这个想法。