0

私は3つの単純なモデルを持っています:

class User < ActiveRecord::Base
    has_many    :subscriptions
end

class Game < ActiveRecord::Base
    has_many    :subscriptions
end

class Subscription < ActiveRecord::Base
    belongs_to  :user
    belongs_to  :game
end

私が疑問に思っているのは、特定のユーザーがゲームにサブスクライブしているかどうかを含む「is_subbed」という別の属性をゲームにクエリするときに含めることは可能ですか? 何かのようなもの:

a_user = User.first

games = Game.scoped
games.conditions blah blah blah

ゲームには、is_subed と呼ばれる a_user にカスタムされる「仮想」属性またはメモリ内属性が含まれます。

4

2 に答える 2

2

次のように、クラス メソッドとインスタンス メソッド (単一のゲーム用) を作成できます。

class Game < ActiveRecord::Base
  def self.subscribed?(user)
    joins(:subscriptions).where(subscriptions: { user_id: user.id}).exists?
  end

  def subscribed?(user)
    subscriptions.where(user_id: user.id).exists?
  end
end

クエリ API を使用して各ゲームのこの結果を取得するには、次のようにします。

scope :with_subscriptions, lambda do |user|
  joins("LEFT JOIN subscriptions ON subscriptions.game_id = games.id AND subscriptions.user_id = #{user.id}")
  select("games.*, CASE WHEN subscriptions.user_id IS NULL THEN true ELSE false END as is_subscribed")
end

これにより、is_subscribed返される各ゲーム オブジェクトのパラメーターが得られます。

于 2013-02-06T20:13:31.780 に答える
0

私が間違っていなければ、一部のユーザーがサブスクライブしているゲームを入手し、これらのゲームにいくつかのスコープを適用する必要がありますか? この方法は受け入れられるかもしれません

# extend user model with games collection
class User < ActiveRecord::Base
    # your code
    has_many :games, through: :subscriptions
end

そして、コントローラー(または必要な場所)で呼び出すだけです

@user.games.your_games_scope1.your_games_scope2.etc

誤解していたらごめんなさい

于 2013-02-07T04:41:56.817 に答える