2012-11-08 31 views
0

在我的控制器中,我有一個帶where方法的即時變量,它是搜索控制器中過濾器的一部分。即時變量,其中方法爲真

@items = @items.where([ 'borrowable = ?', true]) if params[:top_filter] == 'borrow' 

borrowable = ?, true位是完全錯誤的。我想要的是通過使用名爲borrowable?Item's model中的方法過濾@items可借用的

我該怎麼做?

Item model中的方法如下。

def borrowable?(current_user, user, item, controller) 
     false 
     if user.invited?(current_user, user) 
     item.pieces.each do |piece| 
      if piece.available?(current_user, piece) 
      true 
      end 
     end 
     if controller == "pages" 
      true 
     end 
     end 
    end 

回答

2

如果它依賴於模型級代碼,那麼您將無法將它放在where子句中。 where子句試圖獲取項目列表,但是在每個要調用方法的項目上,但是在抓取項目之前沒有方法。你可能會使用存儲過程的數據庫,但只是在Rails代碼中,你可以這樣做:

@items = @items.keep_if { |item| item.borrowable? } if params[:top_filter] == 'borrow' 
+0

非常感謝您使用它! – Dol

+2

顯然'keep_if'等同於'select!',所以我認爲不需要重新分配! –

+0

@Anthony謝謝! – Dol

1

你不能! ActiveRecord對數據庫進行查詢,然後用返回的數據構建對象。因此,直到數據返回,沒有紅寶石對象存在,你不能使用他們的方法。

如果你能代表使用「計算」​​(在SQL意義上的)相同的信息,那麼你可以通過

@items.where("some sql condition/calculation")... 
+0

感謝您的解釋。不幸的是我需要這種方法。但是謝謝你花時間解釋! – Dol