Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在Rails 3中组合不同的作用域?_Ruby On Rails_Ruby On Rails 3_Scope_Conditional Statements_Named Scope - Fatal编程技术网

Ruby on rails 如何在Rails 3中组合不同的作用域?

Ruby on rails 如何在Rails 3中组合不同的作用域?,ruby-on-rails,ruby-on-rails-3,scope,conditional-statements,named-scope,Ruby On Rails,Ruby On Rails 3,Scope,Conditional Statements,Named Scope,我的rails应用程序中有以下命名作用域: scope :published, :conditions => {:status => 'published'} scope :coming_soon, :conditions => {:status => 'coming_soon'} scope :in_development, :conditions => {:status => 'in_development'} scope :cancell

我的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"}

有什么想法吗?

Rails 2:
命名为\u范围:public,:status=>['published','coming\u soon']

Rails 3:
scope:public,其中(:status=>['published','coming\u soon'])

Rails将看到数组并在sql中使用
中的
操作符

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

另一个注意事项:当需要依赖于可变参数的内容时,请小心。例如,如果您想为日程安排系统安排“未来约会”,您可以这样写
[这是无效的]


Rails 2:
命名范围:即将到来的应用程序,条件=>(['appt\u dt>?',Time.now])

Rails 3:
范围:即将发布的应用程序,其中(['appt\u dt>?',Time.now])

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

[这是有效的
]


Rails 2:
named_scope:uncoming_appts,lambda{:conditions=>(['appt\u dt>?',Time.now])

Rails 3:
scope:uncoming_appts,lambda{where(['appt_dt>=?',Time.now])


现在,此范围将在每次执行时(使用时)进行评估。因此,时间。现在将是实际的当前日期时间。

您想要AND还是or?IIRC
|
是或。我对此也感到困惑。问题是combine(听起来像'AND',但代码中有| |这是一个
。他们我注意到我们只看一个字段。一个字段不能同时有两个不同的值(不能有
x=“a”和x=“b”
),所以它必须是
,如:
x=“a”或x=“b”
是的,这是我的想法——它必须是或。但不管怎样,下面的代码似乎有效。一个错误,但你在即将到来的字符串末尾使用了双引号,但以单引号开始。我会更改,但它要求至少六个更改…我在逗号
语法错误:/Users/justin/code/boxfire/app/models/produ上遇到错误ct.rb:37:语法错误,意外',',期待tASSOC…,:conditions=>{“status=?”,['published','coming_soon']}
更改为:
:status=>['published','coming_soon']
并且可以工作。谢谢!谢谢ScottJShea,我修复了它。我给了你一个+1的奖励方法:)添加了rails2/rails3版本的语法。