我遇到的问题是只对活动的对象执行查询。我在数据库中没有活动列,相反,在模型游戏中,我有以下方法:
def complete?
self.winner ? true : false
end
这样,如果游戏有获胜者,#complete?
将返回true。我想查询所有会为此方法返回false的游戏,有没有办法用ActiveRecord执行此操作?现在在我的控制器中,我只是调用@games = Game.all
,然后在我的部分渲染游戏中,如:
<% unless game.complete? %>
yada yada
<% end %>
这似乎有点hacky,如果我想显示“已完成”的游戏,则需要我写一个不同的部分。无论如何,我想知道控制器中是否有一种方法只能分配从模型方法返回true / false的对象?
答案 0 :(得分:8)
快速简便的课程方法怎么样?
class Game < ActiveRecord::Base
def self.completed_games
games = []
Game.all.each { |game| games << game if game.complete? }
return games
end
end
然后致电Game.completed_games
。您也可以为不完整的游戏制作一个。您也可以将该方法设为一行,但我将其分解,以便您可以准确地看到正在发生的事情。
答案 1 :(得分:7)
由于winner
是Game
的属性,为什么不查询?你只需要这个:
completed = Game.where('winner is not null')
incomplete = Game.where('winner is null')
如果您愿意,也可以将它们scopes设为:
class Game < ActiveRecord::Base
scope :finished, where('winner is not null')
scope :unfinished, where('winner is null')
#...
end
然后您可以在数据库中出现任何内容之前添加进一步过滤或订购。
让数据库完成工作,他们擅长搜索和投放数据。每当你将整个表从数据库中拉出来进行客户端处理时,你应该再想一想,因为你几乎肯定会犯错误。
答案 2 :(得分:4)
你可以这样做
Game.all.select{ |game| game.complete? }
答案 3 :(得分:0)
如果你想返回一个 ActiveRecord_Relation 而不是数组 这是一个不是很有效的解决方案,但它是一个开始
games = Game.all.map { |game| game.id if !game.complete? }
Game.where(id: games)
返回所有已完成的游戏对象的 ActiveRecord_Relation