Есть ли лучший способ получить эти данные? - PullRequest
2 голосов
/ 14 сентября 2009

Фотографы "have_many" клиенты.

События клиентов "have_many".

Есть ли лучший способ назначить здесь @events, если пользователь является фотографом?

  def index
    if @current_user.photographer?
      @events = []
      @current_user.clients.each do |client|
        @events << client.events
      end
    else
      @events = @current_user.events
    end
  end

Редактировать: Больше код

# user.rb
class User < ActiveRecord::Base

  has_many :client_associations, 
      :foreign_key => 'photographer_id', 
      :class_name => 'Association', 
      :dependent => :destroy
  has_many :clients, :through => :client_associations

  has_one :photographer_association, 
    :foreign_key => 'client_id', 
    :class_name => 'Association', 
    :dependent => :destroy
  has_one :photographer, :through => :photographer_association

  has_many :events

  def photographer?
    self.role == 'photographer'
  end

end

# association.rb
class Association < ActiveRecord::Base
  belongs_to :client, :class_name => "User"
  belongs_to :photographer, :class_name => "User"
end

# event.rb
class Event < ActiveRecord::Base
  belongs_to :user
  has_many :images      
end

Как видите, все мои пользователи в одной модели с полем "роль".

Ответы [ 2 ]

2 голосов
/ 14 сентября 2009

С точки зрения БД, вы должны загружать все события одновременно и не иметь проблемы N + 1.

  def index
    if @current_user.photographer?
      @events = @current_user.clients.find(:all, :include => :events).map(&:events).flatten
    else
      @events = @current_user.events
    end
  end
0 голосов
/ 14 сентября 2009

Такая логика, IMHO, была бы более правильно настроена на уровне модели.

Вы можете создать новый метод модели, например current_events в модели User, и переместить туда свою логику:

def current_events
    if self.photographer?
         self.clients.find(:all, :include => :events).map(&:events).flatten
    else
         self.events
    end
end

Тогда на вашем контроллере вы можете просто добавить

def index
  @events = @current_user.current_events
end

Таким образом, ваша логика инкапсулирована в вашей модели (и позже может быть улучшена, добавлена ​​с большей сложностью, протестирована), и вашему контроллеру не нужно знать (и заботиться) о том, что это, просто вызывать и показывать current_events пользователя.

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