0

私には3つのモデルがあります-ユーザー。ゲーム、およびアクティビティ。ユーザーがアクティビティレコードを持たないゲームを表示することになっているビューがあります。すでにアクティビティがあるゲームを除外するクエリを作成する方法を理解するのに問題があります。

これらの2つのバージョンを(コントローラーで)実行すると、機能しません(エラーが発生しますundefined method 'game_id' for #<ActiveRecord::Relation:0x69eab40>

バージョン1

def index
  if current_user
    @activities = current_user.activities.game_id
    @games = Game.where("id NOT IN (?)", @activities )
  end
end

バージョン2

def index
  if current_user
    @activities = current_user.activities
    @activity_ids = @activities.game_id
    @games = Game.where("id NOT IN (?)", @activity_ids )
  end
end

ただし、これを行うと機能します。コントローラー:

def index
  if current_user
    @activities = current_user.activities
    @games = Game.where("id NOT IN (?)", @activities.collect {|p| p.game_id} )
  end
end

それがどれほどスケーラブルかわからないので、私はそれをこのようにすることを心配しています。私はこの[質問]からそれを行うというアイデアを思いつきましたが、回答とともに、このソリューションはスケーラブルではないと人々は言いました(これはその質問者にとっては問題ではありませんでした)。1

4

1 に答える 1

1

あなたのエラーはその行にありません。エラーの原因はこれです

@activities = current_user.activities.game_id

current_user.activitiesActiveRecord::Relationオブジェクトであるため、それを呼び出すとgame_id例外が発生します。使用するので、機能するソリューションは問題ありません@activities(使用する予定ですよね?)。より多くのSQLアプローチが必要な場合は、

def index
  if current_user
    @activities = current_user.activities
    @games = Game.where("id NOT IN (?)", @activities.uniq.pluck(:game_id))
  end
end
于 2013-03-08T01:36:21.527 に答える