質問

二重内部結合の必要性を含む奇妙な状況があります。私は必要なクエリを試してみましたが、レールにそれをさせる方法がわかりません。

データ

  • アカウント(has_many:sites)
  • サイト(habtm:users、belongs_to:account)
  • ユーザー(habtm:sites)

それらがhabtmまたは何であることを無視します。habtmまたはhas_many:throughにすることができます。

できるようにしたい

@user.accounts

または

@account.users

その後、もちろんできるはずです

@user.accounts < @some_other_account

そして、@ some.other_accountのすべてのサイトを@ user.sitesに含めます。

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を取得することを心配している方がうまくいくと思いますが、そのままにしておけば他の多くのことでもうまくいきます(ユーザー<!> lt;-<!> gt;サイト)。

役に立ちましたか?

解決

これをカスタム化してアソシエーションにしようとするよりも、カスタムメソッドを作成するのが最善だと思います。たとえば。

# 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アソシエーションのどちらでも機能するはずです。どちらのアプローチを採用するかに応じて、クエリを使用していくつかの最適化を行うことができます。

いつか、深く入れ子になった<=>のサポートを受けられるかもしれません。

他のヒント

これは役に立つかもしれません(Rails 2.x)

http://github.com/ianwhite/nested_has_many_through

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top