开发者

named_scope and HABTM association

开发者 https://www.devze.com 2023-01-11 20:54 出处:网络
I have a models User class User < ActiveRecord::Base has_many :ratings has_many :rated_films, :through => :ratings, :source => :film

I have a models User

class User < ActiveRecord::Base  
  has_many :ratings  
  has_many :rated_films, :through => :ratings, :source => :film  
end  

and Films

class Film < ActiveRecord::Base  
  has_many :users, :through => :ratings  
end  

I am looking to find all Films that have not been rated by 开发者_高级运维the specified user, smth like

class Film < ActiveRecord::Base  
  has_many :users, :through => :ratings  
  named_scope :not_rated_by_user, lambda { |user|  
    {:joins => :users, :conditions => ['? NOT IN users', user]}  
  }  
end  

Film.not_rated_by_user(User.first)  

I am not that familiar with SQL so am not quite sure if this could be achieved in a named scope.

Many thanks

Yuriy


I suppose you have a ratings table, which is your join table. Right? So you need something like:

class User < ActiveRecord::Base  
   has_many :ratings
   has_many :rated_films, :through => :ratings, :source => :film  
end

class Film < ActiveRecord::Base  
   has_many :ratings
   has_many :users, :through => :ratings

   named_scope :not_rated_by_user, lambda { |user_id| {
      :include => :ratings,
      :conditions => ['? NOT IN (ratings.user_id)', user_id]
   }}
end

class Rating < ActiveRecord::Base
   belongs_to :film
   belongs_to :user
end

And you can use

Film.not_rated_by_user(User.first.id)

Please let me know if it helped. I haven't tested!

0

精彩评论

暂无评论...
验证码 换一张
取 消