Ruby on rails 如何在Rails 3中组合不同的作用域?
我的rails应用程序中有以下命名作用域: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
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版本的语法。