Pergunta

Eu tenho uma situação estranha envolvendo a necessidade de participar de um duplo interior. Eu tentei a necessidade de consulta I, eu só não sei como fazer trilhos fazê-lo.

O Data

  • Conta (has_many: Locais)
  • Site (HABTM: usuários, belongs_to: conta)
  • Usuário (HABTM: Locais)

Ignorar que eles são habtm ou qualquer outra coisa, eu posso fazê-los habtm ou has_many:. Através

Eu quero ser capaz de fazer

@user.accounts

ou

@account.users

Então é claro que eu deveria ser capaz de fazer

@user.accounts < @some_other_account

E, em seguida, ter @ user.sites incluem todos os sites de @some_other_account.

Eu brincava com habtm e has_many:. Através mas não pode obtê-lo para fazer o que quero

Basicamente eu preciso para acabar com uma consulta como esta (copiado do phpmyadmin testado e funciona.):

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

Posso fazer isso? Será que é mesmo uma boa idéia ter esse duplo participar? Estou assumindo que iria funcionar melhor se os usuários tinham a associação com contas para começar, e depois se preocupar em obter @ user.sites vez, mas funciona melhor para muitas outras coisas, se for mantido do jeito que está (usuários <-> sites).

Foi útil?

Solução

Eu acho que é melhor para criar métodos personalizados para esta em vez de tentar sapato Horn-lo em uma associação. Por exemplo.

# 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

Não testado, mas que deve funcionar para qualquer um HABTM ou associação has_many :through. Existem algumas otimizações que você pode fazer com a consulta, dependendo da abordagem que você ir com ele.

Um dia nós pode obter suporte para has_many :through profundamente aninhada que iria lidar com um pouco isso.

Outras dicas

Isto pode ser útil para você (Rails 2.x)

http://github.com/ianwhite/nested_has_many_through

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top