Двойное соединение с habtm в ActiveRecord

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

Данные

  • Аккаунт (has_many :sites)
  • Сайт (habtm :users, own_to :account)
  • Пользователь (habtm:sites)

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

я хочу уметь делать

@user.accounts

or

@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, но для многих других вещей это работает лучше, если оно сохраняется таким, как оно есть (пользователи ‹-> места).


person Daniel Huckstep    schedule 29.07.2009    source источник


Ответы (2)


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

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

person ryanb    schedule 31.07.2009
comment
Спасибо! Люблю скринкасты, кстати. - person Daniel Huckstep; 04.08.2009

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

http://github.com/ianwhite/nested_has_many_through

person Christos    schedule 22.04.2010