Объединение таблиц соединений Ruby on Rails - PullRequest
1 голос
/ 10 мая 2010

У меня есть приложение Ruby on Rails, настроенное так:

Модель пользователя

has_and_belongs_to_many :roles

Ролевая модель

has_many :transactions
has_and_belongs_to_many :users

Модель транзакции

belongs_to :role

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

user = User.find(1)
transactions = user.roles.first.transactions

Это вернет транзакции, связанные с первой ролью, назначенной пользователю. Если пользователю назначено 2 роли, на данный момент, чтобы получить транзакции, связанные со второй ролью, я бы сделал:

transactions = user.roles.last.transactions

Я в основном пытаюсь найти способ настроить связь, чтобы я мог получить транзакции пользователя через что-то вроде этого на основе ролей, определенных в ассоциации между пользователем и ролями:

user = User.find(1)
transactions = user.transactions

Я не уверен, возможно ли это? Я надеюсь, вы понимаете, что я пытаюсь сделать.

Ответы [ 2 ]

1 голос
/ 10 мая 2010

Если вы не хотите выполнять отдельные SQL-запросы для поиска транзакций для каждой роли, вы можете сначала получить role_ids для пользователя, а затем найти все транзакции с этими идентификаторами ролей одним запросом:

class User < ActiveRecord::Base
  #...
  def transactions
    Transaction.scoped(:conditions => {:role_id => role_ids})
  end
end

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

user.transactions.all(:limit => 10, :conditions => [ ... ])
0 голосов
/ 10 мая 2010

Вы можете добавить метод к User в , собрать транзакции для каждой роли пользователя в массив массивов и затем сгладить в один массив: *

class User < ActiveRecord::Base
  def transactions
    user.roles.collect { |role| role.transactions }.flatten
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...