用模型方法查询?

时间:2012-01-23 19:43:29

标签: ruby-on-rails ruby-on-rails-3

我遇到的问题是只对活动的对象执行查询。我在数据库中没有活动列,相反,在模型游戏中,我有以下方法:

def complete?
  self.winner ? true : false
end

这样,如果游戏有获胜者,#complete?将返回true。我想查询所有会为此方法返回false的游戏,有没有办法用ActiveRecord执行此操作?现在在我的控制器中,我只是调用@games = Game.all,然后在我的部分渲染游戏中,如:

<% unless game.complete? %>
yada yada
<% end %>

这似乎有点hacky,如果我想显示“已完成”的游戏,则需要我写一个不同的部分。无论如何,我想知道控制器中是否有一种方法只能分配从模型方法返回true / false的对象?

4 个答案:

答案 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)

由于winnerGame的属性,为什么不查询?你只需要这个:

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