Вопрос

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

Данные

  • Учетная запись (has_many :сайты)
  • Сайт (habtm :пользователи, belongs_to : учетная запись)
  • Пользователь (habtm :сайты)

Игнорируйте, что они habtm или что-то еще, я могу сделать их habtm или has_many :through .

Я хочу быть в состоянии делать

@user.accounts

или

@account.users

Тогда, конечно, я должен быть в состоянии сделать

@user.accounts < @some_other_account

А затем попросите @user.sites включить все сайты из @some_other_account.

Я повозился с habtm и has_many : through, но не могу заставить его делать то, что я хочу.

В принципе, мне нужно в конечном итоге получить запрос, подобный этому (скопированный из phpmyadmin.Протестировано и работает):

SELECT accounts.* 
FROM accounts
INNER JOIN sites ON sites.account_id = accounts.id
INNER JOIN user_sites ON sites.id = user_sites.site_id
WHERE user_sites.user_id = 2

Могу ли я это сделать?Это вообще хорошая идея - иметь это двойное соединение?Я предполагаю, что это работало бы лучше, если бы пользователи для начала имели ассоциацию с учетными записями, а затем беспокоились о получении вместо этого @user.sites, но это работает лучше для многих других вещей, если оставить все как есть (users <-> сайты).

Это было полезно?

Решение

Я думаю, что лучше всего создать собственные методы для этого, а не пытаться превратить это в ассоциацию.Например.

# in user.rb
def accounts
  Account.all(:include => {:sites => :users}, :conditions => ["users.id=?", self])
end

def add_account(other_account)
  other_account.sites.each do |site|
    self.sites << site
  end
end

# in account.rb
def users
  User.all(:include => {:sites => :account}, :conditions => ["accounts.id=?", self])
end

Непроверенный, но это должно сработать либо для HABTM, либо has_many :through ассоциация.Есть некоторые оптимизации, которые вы можете внести в запрос в зависимости от того, какой подход вы используете.

Когда-нибудь мы могли бы получить поддержку для глубоко вложенных has_many :through который мог бы справиться с чем-то из этого.

Другие советы

Это может быть полезно для вас (Rails 2.x)

http://github.com/ianwhite/nested_has_many_through

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top