Проблема выяснения Присоединиться к Ассоциации - PullRequest
0 голосов
/ 03 марта 2012

У меня есть Аккаунты, Билеты, Группы:

# group.rb
has_many :tickets
has_many :accounts, :through => :assignments
has_many :assignments

# ticket.rb
belongs_to :group, :class_name => "Group", :foreign_key => "group_id"
has_many :accounts , :through => :assignments
has_many :assignments

# account.rb
attr_accessible :first_name, :last_name, :email, :password, :group_ids, :role
has_many :tickets, :through => :assignments
has_many :assignments    
has_many :groups, :through => :assignments
has_many :assignments

#assignment.rb
belongs_to :account
belongs_to :ticket
belongs_to :group

Я хочу перечислить билеты, к которым относится их группа к current_account group_id с.

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

ОБНОВЛЕНИЕ

Я также назвал области действия для модели Ticket:

  scope :not_archived, where('archived != ?', 1)
  scope :is_archived, where('archived = ?', 1)

Так что мне нужно иметь возможность добавить .not_archived или .is_archived также к.Поэтому не уверен, что ответ @Veraticus сработает.

Ответы [ 2 ]

0 голосов
/ 04 марта 2012

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

#ticket.rb
scope :for_account lambda { |account| joins(:group => :accounts ).where("accounts.id = ?", account.id) }

, который должен генерировать sql как:

SELECT ticets.* FROM ticket
INNER JOIN groups ON tickets.groups_id = groups.id
  INNER JOIN accounts ON groups.account_id = accounts.id
WHERE accounts.id = x

Затем вы можете позвонить:

Ticket.for_account(current_account)

Чтобы получить билеты для текущего аккаунта, и он вытащит все это в одном запросе. Затем вы можете связать это с любыми другими областями, которые вы хотите, например,

Ticket.not_archived.for_account(current_account)
0 голосов
/ 03 марта 2012

Я думаю, вы ищете что-то вроде этого:

current_account.groups.collect(&:tickets)

Это вернет массив всех массивов заявок, прикрепленных к группам current_account. Если вы хотите, чтобы это был только один большой массив, вы можете вызвать flatten в конце:

current_account.groups.collect(&:tickets).flatten

Если у вас есть область применения, я бы сделал что-то вроде этого:

current_account.groups.collect{|g| g.tickets.not_archived.all}.flatten

Когда вы заменяете прицел на то, что хотите.

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