【问题标题】:Chaining named_scopes链接 named_scopes
【发布时间】:2013-04-04 09:03:18
【问题描述】:

我有一个关于使用 named_scopes 的问题:

假设我有以下模型(我知道我提供的一些 named_scope 可以直接通过活动记录实现,但它们仅用于示例):

def person

    named_scope :older_then, lambda {|min_age| {:conditions => ["age > ?",min_age]} }
    named_scope :by_first_name, lambda {|name| {:conditions => {:first_name => name}}}

    def self.some_function(age_param, name_param)
       chain = Person
       chain = chain.older_then(age_param) unless age_param.blank?
       chain = chain.by_first_name(name_param) unless name_param.blank?
       chain.all
    end
end

现在假设我想打电话:

people = Person.some_function(20, "john")

在构建 named_scopes 链时,Rails 将对数据库进行 2 次调用:

select * from persons where age>20
select * from persons where age>20 and name='john'

显然,我想要的只是第二个查询的结果,并不打算在构建 named_scopes 链时执行第一个查询。任何想法我在这里做错了什么/按条件组合多个 named_scope 的正确方法是什么?

顺便说一句,我使用的是 Ruby 1.8.7 它的旧版本,我知道... :(

【问题讨论】:

  • 除非你也使用旧版本的 Rails,否则你应该使用scope,而不是named_scope
  • @meagar:OP 似乎正在使用 Rails 2.x
  • 是的,使用 rails 2.3.11

标签: ruby-on-rails ruby


【解决方案1】:

改变这个:

def self.some_function(age_param, name_param)
   chain = Person

到:

def self.some_function(age_param, name_param)
   chain = self

这将保持原始链完整,而不是开始一个新链。

【讨论】:

  • 好的,但是在链接 2 个 named_scope 时它会解决 2 个 SQL 查询(而不是一个)的问题吗?
  • 它不能解决问题,即使按照您的建议使用 self 而不是模型来声明链,将 2 个 named_scopes 添加到链中,创建对 db 的 2 个调用,而不仅仅是 1
  • 我的错,在我调试时它只执行了 2 个查询而不是 1 个,我猜 IDE 执行这些查询是为了评估变量
猜你喜欢
  • 2010-09-15
  • 2011-02-17
  • 1970-01-01
  • 2011-02-16
  • 1970-01-01
  • 2011-01-12
  • 2010-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多