문제

나는 이중 내부 조인이 필요하고 이상한 상황이 있습니다. 필요한 쿼리를 시도했는데 레일을 만드는 방법을 모르겠습니다.

자료

  • 계정 (has_many : 사이트)
  • 사이트 (habtm : user, solgs_to : 계정)
  • 사용자 (HABTM : 사이트)

그들이 habtm이거나 무엇이든 것을 무시하면, 나는 그들을 habtm 또는 has_many로 만들 수 있습니다.

나는 할 수 있고 싶다

@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를 대신받는 것에 대해 걱정하지만 다른 많은 것들에 대해 더 잘 작동합니다 (사용자 <-> 사이트).

도움이 되었습니까?

해결책

나는 그것을 협회로 신발하려고하는 대신 이것을위한 맞춤형 방법을 만드는 것이 가장 좋다고 생각합니다. 예를 들어.

# 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