2011-01-15 5 views
0

У меня есть таблица posts и полиморфный стол votes.Rails 3 Присоединиться к вопросу для голосов Таблица

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 

ответ

2

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

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

Я должен также упомянуть, что я использую metawhere камень. – Dex