首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >作用域和rails中的作用域

作用域和rails中的作用域
EN

Stack Overflow用户
提问于 2012-08-10 18:45:23
回答 2查看 15.1K关注 0票数 14

谁能解释一下这个方法是做什么的,我可以传递给它什么?

代码语言:javascript
复制
scoped(options = nil)
Returns an anonymous scope.

还有,scope方法做了什么?在看完文档后,我不明白。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-10 20:49:27

在ActiveRecord中,所有查询构建方法(如whereorderjoinslimit等)都返回一个所谓的作用域。只有当您调用allfirst之类的kicker方法时,才会执行构建的查询并返回数据库的结果。

scoped类方法还返回一个作用域。默认情况下,返回的作用域为空,这意味着结果集不会受到任何限制,这意味着如果执行查询,则会返回所有记录。您可以使用它来提供一个“空”的替代方案,就像MurifoX的query_by_date示例中那样。或者您可以使用它将多个条件组合到一个方法调用中,例如:

代码语言:javascript
复制
Model.scoped(:conditions => 'id < 100', :limit => 10, :order => 'title ASC')

# which would be equivalent to
Model.where('id < 100').limit(10).order('title ASC')

scope类方法允许您定义也返回作用域的类方法,例如:

代码语言:javascript
复制
class Model
  scope :colored, lambda {|col|
    where(:color => col)
  }
end

它可以像这样使用:

代码语言:javascript
复制
Model.colored

作用域的好处是您可以(几乎)按照自己的意愿将它们组合在一起,因此以下操作是完全可能的:

代码语言:javascript
复制
Model.red.where('id < 100').order('title ASC').scoped(:limit => 10)

我也强烈建议通过http://guides.rubyonrails.org/active_record_querying.html阅读

票数 31
EN

Stack Overflow用户

发布于 2012-08-10 19:51:09

我在对ActiveRecord查询接口进行链式调用的past.When中使用了它,如下所示:

代码语言:javascript
复制
Model.where(:conditions).where(:more_conditions).where(:final_conditions)

它们中的每一个都已经被限定了作用域,使得链工作起来没有任何问题。但是假设你有这样的东西:

代码语言:javascript
复制
Model.query_by_date(date).query_by_user(user).query_by_status(status)

scope :query_by_date, lambda { |date|
  case date
  when "today"
    where(:date => Date.today)
  when "tomorrow"
    where(:date => Date.tomorrow)
  else
    # Any value like '' or 0 or Date.whatever
  end
}

如果日期参数不是今天或明天,这将导致错误。它将选取最后一个值,并尝试将该查询与下一个query_by_user链接起来,从而产生一个undefined method default_scoped? for ''。但是如果你把一个scoped方法放在else条件中,它将没有任何缺陷,因为你告诉activerecord你通过这个方法/命名作用域传递,没有对where/find/other activerecord methods进行任何调用,但返回了一个作用域对象,所以你可以继续链接查询和其他东西。

最终会是这样的。

代码语言:javascript
复制
else
  scoped
end

希望你能理解这个简单的例子。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11900062

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档