Двойное соединение с habtm в ActiveRecord - PullRequest
3 голосов
/ 30 июля 2009

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

Данные

  • Аккаунт (has_many: sites)
  • Сайт (habtm: пользователи, принадлежит_ к аккаунту)
  • Пользователь (habtm: sites)

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

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

@user.accounts

или

@account.users

Тогда, конечно, я смогу сделать

@user.accounts < @some_other_account

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

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

В основном мне нужно получить такой запрос (скопировано с 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 <-> сайты).

Ответы [ 2 ]

3 голосов
/ 01 августа 2009

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

# 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, который бы справился с некоторыми из них.

2 голосов
/ 22 апреля 2010

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

http://github.com/ianwhite/nested_has_many_through

...