2012-04-30 54 views
1

我在Rails模型中有以下範圍。哪裏不IN()加入?

class Suggestion < ActiveRecord::Base 
    has_many :favourites 

    def self.favoured_by(user) 
    joins(:favourites).where(favourites: { user_id: user.id }) 
    end 
end 

這很好地工作。它會返回特定用戶喜歡的所有建議。

我該如何檢索所有不受歡迎的建議,或者哪些受到歡迎,但不受此特定用戶的建議?

def self.not_favoured_by(user) 
    # ... 
end 

Favourite模式是這樣的:

class Favourite < ActiveRecord::Base 
    belongs_to :suggestion 
    belongs_to :user 
end 
+0

你能不能也發表您的'favourite'模式? –

+0

爲什麼你不建立一個關係has_many而不是那個連接? –

+0

@ismaelga @PaulSimpson我在OP中加入了我的'Favourite'模型。 'Favourite'需要是'User'和'Suggestion'之間的連接模型,因爲用戶可以收藏屬於其他用戶的建議。 –

回答

4
favorited_suggestions_ids = joins(:favourites).where(favourites: { user_id: user.id }).map(&:id) 
return scoped if favorited_suggestion_ids.empty? 
where('id not in (?)',favorited_suggestions_ids) 
+0

'ActiveRecord :: StatementInvalid: SQLite3 :: SQLException:模棱兩可的列名稱:id:SELECT「suggestions」。* FROM「suggestions」INNER JOIN「favorites」ON「favorites」。「suggestion_id」=「suggestions」。「id」 WHERE(id不在(2))ORDER BY created_at DESC'。我的第一個想法是將'id'加上'suggestions'前綴,但這似乎不起作用。 –

+0

你做了'suggestion_id不在(?)'和'.map(&:suggestion_id)'?我不知道什麼是ID –

+0

其實我認爲你不需要第二個查詢中的連接,因爲你不需要那裏的最愛。編輯我的答案。問題應該解決。這個錯誤是因爲在那個連接中存在suggestions.id和favourites.id,所以通過模棱兩可意味着有多個id可以選擇 –

0

如何:

def self.not_favoured_by(user) 
    sql = <<-SQL 
    SELECT suggestions.* FROM suggestions 
    WHERE NOT EXISTS 
     (SELECT id FROM favourites WHERE user_id = #{user.id} AND favourites.suggestion_id = suggestions.id); 
    SQL 
    find_by_sql(sql) 
end 
+0

雖然這個版本確實工作,我更喜歡非原始的SQL版本,所以這就是爲什麼我接受那一個。 –