【问题标题】:activerecord find through associationactiverecord 通过关联查找
【发布时间】:2011-06-03 10:22:06
【问题描述】:

我正在尝试从我的数据库中检索一个 activerecord 对象。我的模型是

class User < ActiveRecord::Base
   belongs_to :account
   has_many :domains, :through => :account    
end

class Account < ActiveRecord::Base
   has_many :domains
   has_many :users
end

class Domain < ActiveRecord::Base
   belongs_to :account
end

现在我想根据用户名和域名检索用户(假设这些分别是 User 和 Domain 类的属性)。即类似于

User.find(:first, :conditions =>{:username => "Paul", :domains => { :name => "pauls-domain"}})

我知道上面的代码行不通,因为我不得不提一些关于 domains 表的内容。此外,用户和域之间的关联是一对多的(这可能会使事情进一步复杂化)。

关于如何形成此查询的任何想法?

【问题讨论】:

  • 您确定您的模型关联正确吗?他们似乎没有。

标签: ruby-on-rails activerecord has-many-through


【解决方案1】:

如果你使用的是 Rails 3.x,下面的代码会得到查询结果:

User.where(:username => "Paul").includes(:domains).where("domains.name" => "paul-domain").limit(1)

要检查发生了什么,您可以将.to_sql 附加到上面的代码中。

如果您使用的是 Rails 2.x,最好编写原始 sql 查询。

【讨论】:

  • 我尝试了您的方法,但无法获得正确的连接条件。我最终做了一个组合,其中包括一个原始查询和 arel(是的,它是 Rails 3)
  • 这正是我在谷歌搜索的内容。有关手册参考,请参阅:ActiveRecord::QueryMethods#includes 注意: 确保方法名称是复数形式。单数形式很可能会调用Module#include
【解决方案2】:

下面的代码可以解决问题:

User.joins(:account).joins('INNER JOIN "domains" ON "accounts"."id" = \
"domains"."account_id"').where(:users => {"username" => "Paul"}).
where(:domains => {"name" => "paul-domain"})

很抱歉这行代码的格式问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多