2016-04-22 49 views
0

我一直在這個問題上,並且無法做到。我有一個gig模型和幾個表。在每張表格中,我只需要展示符合特定要求的演出,但是我無法弄清楚一張表格。紅寶石在軌道上。使用示波器和屬性對我的模型在表格中排序

此表必須包含在那裏的演出:

  • 沒有過期(日期屬性不過去)

  • 過期但將填充==真(在過去的日期屬性,但屬性填充真)

表一定不能包含演出,其中:

  • 已過期,未填寫。 (在過去和充滿屬性==假日期屬性)

我的範圍:變化的

scope :expiredr, -> { where('gigzonetime <= ?', Time.current.to_datetime)} 
scope :notfilled, -> {where(filled: false)} 
scope :filled, -> {where(filled: true)} 
scope :expired_and_filled, ->() {self.expiredr.merge(self.filled)} 
scope :expired_and_notfilled, ->() { self.expiredr.merge(self.notfilled) } 

我已經試過負載,例如。

控制器:

def dashboard 
    if user_signed_in? && !current_user.try(:artist?) 
     @activegigs = current_user.gigs.notcompleted.where.not(:expired_and_notfilled) 
     @q = @activegigs.ransack(params[:q]) 
     @dashgigs = @q.result(distinct: true).order(filled: :desc, reviewed: :desc, date: :asc).page(params[:page]).per(20) 
    else 
    redirect_to(root_url) 
    flash[:danger] = "This page is for registered hosts only" 
    end 
end 

這給出了一個

RuntimeError at /gigs/dashboard 

unsupported: Symbol 

OR

@activegigs = current_user.gigs.notcompleted && current_user.gigs.expired_and_filled && current_user.gigs.notexpired 

這隻能說明expired_and_filled演出。

我不知道如何否定expired_and_notfilled範圍或者如果這甚至是必要的。任何建議,將不勝感激,謝謝。

回答

1

OK,所以邏輯似乎只需要!過期或填充。不需要過期OR(過期和填充)NOT(過期和填充)邏輯樹。這構建了一個簡單的查詢的地方:

.where('gigzonetime > ? OR filled IS TRUE', Time.current.to_datetime) 
+0

這似乎確實有效。謝謝,我不知道如何進行'OR'查詢。 –

1

使用ransack,我們需要有一個OR條件not_expiredexpired_and_filled以滿足您所提到的表格內容。

添加一個新的範圍,列入白名單的兩個作用域使用ransackable_scopes(documentation here)

# gig.rb 
scope :not_expired, -> { where('gigzonetime > ?', Time.current.to_datetime) } 

def self.ransackable_scopes(auth_object = nil) 
    [:not_expired, :expired_and_filled] 
end 

是由洗劫過濾現在我們可以使用採用先進的洗劫合併查詢「或」而不是默認的「AND」 (documentation here)

你需要確保

params[:q] == {m: 'or', not_expired: true, expired_and_filled: true } 

你可以通過m: 'or'通過hidden_field,以便params看起來像上面那樣。

下面應該可以正常工作。

@q = Gig.ransack(params[:q]) 
@gigs = @q.result(distinct: true).order(filled: :desc, reviewed: :desc, date: :asc).page(params[:page]).per(20) 

@gigs現在應該包括not_expired演出和音樂會expired_and_filled一起

+0

上面的答案發布時,我正在嘗試您的答案,它似乎更簡單。謝謝你的回覆,雖然我已經瀏覽了你鏈接的文檔,我將能夠在我的項目中使用它來做其他事情。 –

+0

@RobHughes沒問題! :)雖然這個解決方案是針對Ransack的。但是,如果你不關心盜竊參數,Andy的答案就是要走的路。你也可以把它放到一個範圍內。 –