Я не рассматриваю это как ассоциацию, потому что ассоциация - это обычно то, где у вас есть внешний ключ, указывающий на что-то, но в этом случае у вас нет внешнего ключа. Я вижу это как атрибут экземпляра, который я хотел бы сделать так:
def unviewed_games
Game.all(:conditions => ["id NOT IN (SELECT game_id FROM game_views WHERE user_id = ?", self.id])
end
Вы можете сделать NOT IN (1,2,3)
, запросив просмотренные игры, но это может быть очень неэффективно, очень и очень быстро. Это один раз, когда я бы выписал SQL. Я также сделал бы еще одну вещь:
def unviewed_games
return @unviewed_games if defined(@unviewed_games)
@unviewed_games = Game.all(:conditions => ["id NOT IN (SELECT game_id FROM game_views WHERE user_id = ?", self.id])
end
Это сохранит его в переменной экземпляра для длины запроса и сохранит несколько обращений к базе данных. Вы можете сделать ||=
, но если каким-то образом вы получите nil
, то вы все равно запросите базу данных несколько раз. Рельсы должны кешироваться, но назовите меня параноиком.
Надеюсь, это поможет!