用模型方法查询?
我在仅对活动对象执行查询时遇到问题。 我在数据库中没有活动列,相反,在模型游戏中,我有以下方法:
def complete? self.winner ? true : false end
那么如果一个游戏有一个赢家, #complete?
将返回true。 我想查询所有会为此方法返回false的游戏,有没有办法使用ActiveRecord执行此操作? 现在在我的控制器中我只是调用@games = Game.all
,然后在我的部分渲染游戏中:
yada yada
这看起来有点像hacky,如果我想显示“已完成”的游戏,则需要我写一个不同的部分。 无论如何,我想知道控制器中是否有一种方法只能分配从模型方法返回true / false的对象?
快速简便的类方法怎么样?
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
。 您也可以为不完整的游戏制作一个。 您也可以将该方法设为一行,但我将其分解,以便您可以准确地看到正在发生的事情。
由于winner
是Game
的财产,为什么不查询? 你只需要这个:
completed = Game.where('winner is not null') incomplete = Game.where('winner is null')
如果您愿意,也可以将它们作为范围 :
class Game < ActiveRecord::Base scope :finished, where('winner is not null') scope :unfinished, where('winner is null') #... end
然后你可以在数据库出来之前添加进一步的过滤或排序。
让数据库完成工作,他们擅长搜索和投放数据。 无论何时将整个表从数据库中拉出来进行客户端处理,您都应该再次考虑,因为您几乎肯定会犯错误。
你可以这样做
Game.all.select{ |game| game.complete? }