Rails 3 присоединиться к вопросу для таблицы голосов - PullRequest
0 голосов
/ 15 января 2011

У меня есть таблица posts и полиморфная таблица votes.

Таблица votes выглядит следующим образом:

create_table :votes do |t|
  t.references :user       # user_id
  t.integer    :vote       # the vote value
  t.references :votable    # votable_type and votable_id
end

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

def self.where_not_voted_on_by(user)
  sql = "SELECT P.* FROM posts P LEFT OUTER JOIN ("
  sql << where_voted_on_by(user).to_sql
  sql << ") ALREADY_VOTED_FOR ON P.id = ALREADY_VOTED_FOR.id WHERE (user_id is null)"
  puts sql
  resultset = connection.select_all(sql)
  results = []
  resultset.each do |r|
    results << Post.new(r)
  end
  results
end

def self.where_voted_on_by(user)
  joins(:votes.outer).where("user_id = #{user.id}").select("posts.*, votes.user_id")
end

1 Ответ

2 голосов
/ 16 января 2011

Хорошо, у меня ушло достаточно много времени, но ответ был намного проще:

joins(:votes.outer, "AND user_id = #{user.id}").where("votes.vote IS NULL")
...