0

我有三个模型 - 用户。游戏和活动。我有一个视图应该显示用户没有活动记录的游戏。我无法弄清楚如何编写排除已经有活动的游戏的查询。

当我做这两个版本(在控制器中)时,它不起作用(我收到错误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

我担心这样做,因为我不确定它的可扩展性。我从这个 [question] 中得到了这样做的想法,但是人们说这个解决方案是不可扩展的(这对那个提问者来说不是问题)。1

4

1 回答 1

1

你的错误不在那一行。是什么导致你的错误是这个

@activities = current_user.activities.game_id

current_user.activities是一个ActiveRecord::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 回答