2011-08-12 57 views
0

我有四个轨道模型,称为用户,学校,订阅和news_item。我是一个用户订阅学校以获得该学校的新闻通知的情况,如何显示用户订阅的所有news_items。简单的模型关系问题

我的用户模型具有此

belongs_to :school 
    has_many :schools, :through => :subscriptions 
    has_many :subscriptions 

    def subscribe_to(school) 
    subscribe = subscriptions.build(:school_id => school.id) 
    if !subscribe.save 
     logger.debug "you have already subscribed to '#{school.name}'" 
    end 
    end 

after_create:create_school_subscription DEF create_school_subscription 学校= self.school_street self.subscriptions.build(:学校ID => school.id) 端

和我的订阅型号有

belongs_to :user 
    belongs_to :school, :class_name => 'School' 
    validates_uniqueness_of :school_id, :scope => :user_id 
    validates_presence_of :user_id, :school_id 

我校模型

has_many :users 
    has_many :news_items 

最后我news_item模型

belongs_to :school 

这一切。实行我怎样才能让所有用户通过学校订阅的新闻

回答

2
class NewsItem 
    scope :news_for, lambda { |user| 
    { 
     :joins  => "INNER JOIN subscriptions on news_items.school_id = subscriptions.school_id", 
     :conditions => "subscriptions.user_id = #{user.id}" 
    } 
    } 
end 

NewsItem.news_for(User.first) 
+0

我不断收到sql错误 – Uchenna

+0

你得到的错误是什么? – rubish

+0

这是错误:'ActiveRecord :: StatementInvalid:Mysql2 :: Error:你的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以便在'news_items.school_street_id = subscriptions.school_id WHERE(subscriptions.us'在第1行:SELECT'news_items'。* FROM news_items' news_items订阅'news_items' school_id = subscriptions.school_id WHERE(subscriptions.user_id = 2) ' – Uchenna

0

如果你想要所有学校的用户的所有新闻项然后:

usr.schools.map{|s| s.news_items}.flatten 

如果你想所有只有用户所属学校的新闻项目:

usr.school.news_items 

祝你好运! :)

+0

哇一个很好的答案..只是尝试了一下,它工作正常...很爽..让我尝试了第二个答案 – Uchenna

+0

这将触发N + 1个查询,如果用户有n个学校。一个获取用户的学校,然后每个学校的news_items获得1个。 – rubish