2012-03-14 24 views
1

我在我的Rails應用程序下面的命名範圍:「很快就梳理」如何在Rails 3中結合不同的作用域?

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

任何想法?

+0

你想要一個AND或OR嗎? IIRC'||'是OR。 – ScottJShea 2012-03-14 19:26:11

+0

我也對此感到困惑。這個問題說的是組合(聽起來像'AND',但代碼有'OR',他們注意到我們只看一個字段,字段不能同時是兩個不同的值(可以'沒有'x =「A」AND x =「b」'!),所以它必須是一個'OR',如:'x =「a」OR x =「b」' – 2012-03-14 19:31:31

+0

是的,那是我的想法 - 它必須是OR,但無論如何,下面的代碼似乎工作 – Slick23 2012-03-14 19:32:46

回答

3

軌道2:named_scope :public, :status => ['published', 'coming_soon']
導軌3:scope :public, where(:status => ['published', 'coming_soon'])

Rails會看到陣列和在SQL使用IN運算符。

備註:Article.published.coming_soon的另一種方法(鏈接現有範圍)將不起作用,因爲一篇文章在當時不可能既是那些東西,也可能是彼此的子集。

另一個注意事項:小心當你想要的東西依賴於一個可變參數。例如說你想 「未來的任命」 的調度系統,你可以寫
[這是無效]

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

但是有一個問題: Time.now將得到評估第一次評估課程不是當時範圍本身進行評估。
爲了克服這一點,你使用lambda(愚蠢的名字,但基本上意味着匿名函數 - 或把它更簡單的「一個實際上不具有名稱功能」)如下:

[這是有效 ]

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

此範圍將現在就在執行時每次評價 - 它被用於 - 所以Time.now將是實際電流的日期 - 時間。

+1

一個尼特,但你使用了一個雙引號在coming_soon字符串的結尾處,但是以single開頭,我會改變,但它至少要求六個變化... – ScottJShea 2012-03-14 19:28:08

+0

我收到了一個錯誤的逗號'SyntaxError:/Users/justin/Code/boxfire/app/models/product.rb:37:語法錯誤,意外',',期待tASSOC .. 。::conditions => {「status =?」,['published','coming_soon']}' – Slick23 2012-03-14 19:28:56

+0

已更改爲:':status => ['published','coming_soon']' – Slick23 2012-03-14 19:30:06

相關問題