Вопрос простой модели отношений - PullRequest
0 голосов
/ 13 августа 2011

У меня есть четыре модели рельсов: user, school, subscription и news_item. В ситуации, когда пользователь подписывается на школу, чтобы получать уведомления о новостях из этой школы, как можно отобразить все новостные элементы, на которые подписан пользователь.

моя модель пользователя имеет это

  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.subscription.build (: school_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 ]

2 голосов
/ 13 августа 2011
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 голосов
/ 13 августа 2011

Если вам нужны все новости всех школ пользователя, то:

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

Если вы хотите, чтобы все новости только школы принадлежали пользователю, то:

usr.school.news_items

Удачи!:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...