2012-04-30 55 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版本,所以这就是为什么我接受那一个。 –