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

数据

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

  • 忽略它们是 habtm 或其他什么,我可以使它们 habtm 或 has_many :through。

    我希望能够做到
    @user.accounts
    

    或者
    @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 会更好,但如果保持原样,它对许多其他事情的效果会更好(用户 网站)。

    最佳答案

    我认为最好为此创建自定义方法,而不是试图将其硬塞到关联中。例如。

    # 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 的支持,它可以处理其中的一些问题。

    关于ruby-on-rails - 在 ActiveRecord 中与 habtm 双重连接,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1203601/

    10-13 02:08