2012-04-30 4 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 troughの関係を作らないのですか? –

+0

@ismaelga @PaulSimpson私は自分のFavouriteモデルをOPに追加しました。 '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"お気に入り "ON" favorites "。" suggestion_id "=" suggestions "。" id " WHERE((2)にないid)ORDER BY created_at DESC'。私の最初の考えは、 'id'の前に' suggestions'を付けることでしたが、それはうまくいかないようです。 –

+0

あなたは '(?)'と '.map(&:suggestion_id)'ではなく 'suggestion_id 'ですか?私はidが何であるか分からなかった –

+0

実際には、そこにお気に入りが必要ないので、2番目のクエリでは結合が必要ないと思います。私の答えを編集しました。問題を解決する必要があります。エラーは、その結合には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

このバージョンは動作しますが、私は非raw SQLバージョンを好むので、それを受け入れています。 –

関連する問題