【问题标题】:How to combine different scopes in Rails 3?如何在 Rails 3 中组合不同的范围?
【发布时间】:2012-03-31 07:29:47
【问题描述】:

我的 rails 应用程序中有以下命名范围:

  scope :published, :conditions => {:status => 'published'}
  scope :coming_soon, :conditions => {:status => 'coming_soon'}
  scope :in_development, :conditions => {:status => 'in_development'}
  scope :cancelled, :conditions => {:status => 'cancelld'}

我在写一个结合了“已发布”和“即将梳理”的文章时遇到了麻烦。这是我尝试过的。

  scope :public, :conditions => {"status == published || status == coming_soon"}

有什么想法吗?

【问题讨论】:

  • 您想要 AND 还是 OR? IIRC || 是 OR。
  • 我也对此感到困惑。问题说组合(听起来像'AND',但代码有||这是一个OR。他们我注意到我们只是在看一个字段。一个字段不能同时是两个不同的值(可以'没有x = "A" AND x = "b"!) 所以它必须是OR,如:x = "a" OR x = "b"
  • 是的,这是我的想法——它必须是 OR。但无论哪种方式,下面的代码似乎都可以工作。

标签: ruby-on-rails ruby-on-rails-3 scope conditional-statements named-scope


【解决方案1】:

Rails 2:named_scope :public, :status => ['published', 'coming_soon']
导轨 3:scope :public, where(:status => ['published', 'coming_soon'])

Rails 将看到数组并在 sql 中使用 IN 运算符。

注意事项:Article.published.coming_soon 的另一种方法(链接现有范围)将不起作用,因为文章不能同时是这两者,也不能是彼此的子集。

另一个注意事项:当你想要依赖于可变参数的东西时要小心。例如,假设您想要一个调度系统的“未来约会”,您可能会写
[这是无效]

Rails 2:named_scope :upcoming_appts, :conditions => (['appt_dt > ?', Time.now])
导轨 3:scope :upcoming_appts, where(['appt_dt > ?', Time.now])

但是有一个问题:Time.now 将在评估范围本身时评估类的第一次评估 不是 .
为了克服这个问题,您可以使用 lambda(愚蠢的名称,但基本上意味着匿名函数 - 或者更简单地说“实际上没有名称的函数”),如下所示:

[这是有效]

Rails 2:named_scope :upcoming_appts, lambda {:conditions => (['appt_dt > ?', Time.now])}
导轨 3:scope :upcoming_appts, lambda {where(['appt_dt >= ?', Time.now])}

这个范围现在将在每次执行时被评估 - 它被使用 - 所以 Time.now 将是实际的当前日期时间。

【讨论】:

  • 一个 nit,但您在coming_soon 字符串的末尾使用了双引号,但以单引号开头。我会改变,但它要求至少有六个改变......
  • 我在逗号 SyntaxError: /Users/justin/Code/boxfire/app/models/product.rb:37: syntax error, unexpected ',', expecting tASSOC ..., :conditions => {"status = ?", ['published', 'coming_soon']} 上遇到错误
  • 更改为::status => ['published', 'coming_soon'] 并且可以正常工作。谢谢!
  • 感谢 ScottJShea,我修好了。我给了你一个 +1 所以通常是一种奖励方式:)
  • 添加了 rails2 / rails3 版本语法。
猜你喜欢
  • 2012-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多