has_many "не что-то": через.Какие условия я должен использовать? - PullRequest
1 голос
/ 21 июля 2010

У меня есть пользователь, игра и GameView.GameView описывает то, что видели пользователи.Проблема в том, что я не могу понять, какие условия я должен использовать для получения игр без просмотра.

class User < ActiveRecord::Base
  has_many :game_views
  has_many :unviewed_games, :through => :game_views, :source => :game, ???what conditions???
end

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

Ответы [ 3 ]

1 голос
/ 21 июля 2010

Я не рассматриваю это как ассоциацию, потому что ассоциация - это обычно то, где у вас есть внешний ключ, указывающий на что-то, но в этом случае у вас нет внешнего ключа. Я вижу это как атрибут экземпляра, который я хотел бы сделать так:

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, то вы все равно запросите базу данных несколько раз. Рельсы должны кешироваться, но назовите меня параноиком.

Надеюсь, это поможет!

0 голосов
/ 21 июля 2010

Вы не можете выразить отношения таким образом в Rails, используя has_many :through (или, по крайней мере, насколько мне известно). Но вы можете создать именованную область видимости на основе :game_views для извлечения нужных объектов.

Полагаю, это поможет (не проверено):

named_scope :unviewed_games, :joins => 'LEFT JOIN game_views ON game_views.game_id = games.id', :conditions => 'game_view_id IS NULL')

0 голосов
/ 21 июля 2010

Почему у вас нет has_many: seen_games и вы не пишете отдельный метод для сбора игр без просмотра?Я бы не решился добавить больше логики в has_many.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...