0

私はUserクラスとのHABTM関係を持つEventクラスを持っています。私は2つのユーザーが関連付けられているイベントのみを含むイベントスコープを作成しようとしています。HABTMリレーションシップカウントを持つRailsスコープ

私は現在、以下を返すイベント#ステータス方法があります。

def status 
    self.users.length == 2 ? "matched" : "not matched" 
end 

だから今、基本的に私はすべての「マッチ」イベントを含むスコープを作成する方法を見つけようとしています。私はscope :matched, self.users.length == 2を試しましたが、これはまったく動作しませんでしたが、紛失しているのと同様の方法がありますか?

EDIT:このクラスメソッドはこれを正しく行いますが、スコープ内にカプセル化することができればなおさらです。

def self.pending 
    Event.all.map { |e| e if e.status == "matched" } 
end 

答えて

0

ここではいくつかの問題があります。現在、statusメソッドはリテラル文字列を返していますが、これは少し驚くべきことです。この戻り値をブール値にする方が一般的です。また、名前statusは説明的ではありません。おそらくexactly_two_users?が良いでしょう。さらに、users.lengthの代わりにusers.countを使用すると、DBはより効率的にカウントを行います。

あなたのスコープは単にwhere(:users.count => 2)であると私は信じています。

+0

私は実際にメソッドを少し簡略化しましたが、3つの異なるステータスを返すことになっています。 ''(:users.count => 2) 'はうまくいきませんでした。残念ながら、シンボルのカウント方法はないと言います。 –

+0

「users.count」が代わりに機能するかもしれません。私はちょうど成功なしの構文のクイック検索をしました。とにかく、それは基本的なアイデアです。 –