1

Railsモデルには次のスコープがあります。

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
4

2 に答える 2

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)
于 2012-04-30T03:02:37.000 に答える
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
于 2012-04-30T03:01:31.380 に答える