【发布时间】:2011-08-30 18:08:37
【问题描述】:
这个 ruby/rails 结构总是让我感到困惑:
User.where(:name => "Thiago").limit(3).using(:slave_one)
这必须从左到右执行,以便每个连续的调用都有一个接收器。所以我们从 User 类开始,在它上面调用where,它返回一个ActiveRecord::Relation 的实例。然后在该实例上调用limit,返回另一个ActiveRecord::Relation 实例。然后在该实例上调用using(恰好选择了一个分片)。我猜,整个事情在ActiveRecord::Relation 对象中构建了一个SQL 查询。我的问题是,“是什么触发了查询的实际执行”?它不能在链中的任何特定点执行,因为链中可能存在进一步修改查询的后继。即使在using 返回之后,查询仍然无法执行,因为它无法知道是否附加了附加方法到链上。显然,它确实是在构建后执行查询,那么查询实际上是如何调用的呢?
谢谢...我现在看到链中方法的名称具有“语义”。有些人会进一步修改正在构建的查询。最后一个也是唯一的最后一个可能是需要获取数据的类型。
【问题讨论】:
标签: ruby-on-rails ruby activerecord rails-activerecord active-record-query