在ActiveRecord中与habtm进行双重连接

时间:2009-07-29 23:15:55

标签: ruby-on-rails activerecord associations has-and-belongs-to-many

我有一个奇怪的情况,需要双内连接。我已经尝试了我需要的查询,我只是不知道如何让rails做到这一点。

数据

  • 帐户(has_many:sites)
  • 网站(habtm:users,belongs_to:account)
  • 用户(habtm:sites)

忽略他们是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,它会更好地工作,但是如果它保持原样(用户&lt; - &gt;网站)。

2 个答案:

答案 0 :(得分:3)

我认为最好为此创建自定义方法,而不是试图将它变成一个关联。例如。

# 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的支持,这会处理其中的一部分。

答案 1 :(得分:2)

这可能对您有用(Rails 2.x)

http://github.com/ianwhite/nested_has_many_through