2012-01-23 4 views
2

アクティブなオブジェクトのみのクエリを実行する際に問題が発生しました。モデルメソッドでクエリしますか?

def complete? 
    self.winner ? true : false 
end 

ゲームが勝者を持っている場合、#complete?はtrueを返します方法:私の代わりに、モデルのゲームに、私は次のメソッドを持って、データベースに活性カラムを持っていません。このメソッドでfalseを返すすべてのGamesを照会したいのですが、ActiveRecordでこれを行う方法はありますか?今、私のコントローラで私は単に@games = Game.allを呼んでいるし、その後のような私の部分のレンダリングゲームで:

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

これは一種のハックようだ、と私は表示させたい場合は、別の部分を書くために私が必要となる「完成します" ゲーム。とにかく、モデルメソッドからtrue/falseを返すオブジェクトだけをコントローラに割り当てる方法があるかどうか疑問に思っていましたか?

答えて

6

迅速で簡単なクラスメソッドはどうですか?

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つを作ることもできます。あなたはその方法を1行にすることもできますが、何が起こっているかを正確に見ることができるように、私はそれを壊しました。

+0

のように行うことができます。なぜスコープを使用しないのですか? – snowangel

+2

@snowangelこの正確な例では、はい、そうです。私がこれを書いた時点では、私はまだRailsにはかなり新しく、私はまだスコープを本当に理解しているとは思わない。しかし、より大きな意味では、問題のメソッドがより複雑でSQLで記述できない場合でも、この方法はまだ有効です。 – MrDanA

+0

理にかなって、十分に公平です! – snowangel

6

winnerGameのプロパティであるため、質問してみませんか?

class Game < ActiveRecord::Base 
    scope :finished, where('winner is not null') 
    scope :unfinished, where('winner is  null') 
    #... 
end 

と何がデータベースから出てくる前に、あなたはさらにフィルタリングや を注文を追加することができます。あなたがそう望むなら、あなたはまた、それらscopes作ることができます

completed = Game.where('winner is not null') 
incomplete = Game.where('winner is null') 

:あなたはこれを必要とします。

データベースに作業をさせてください。彼らはデータを検索したり、データをスリングしたりしています。クライアント側の処理のためにデータベース全体をデータベースから取り出すときは、間違いなく間違いを犯しているので、もう一度考える必要があります。

2

ます。これは、テーブル全体をロードし、この

Game.all.select{ |game| game.complete? } 
関連する問題