0

在我的控制器中,我有一个带有where方法的即时变量,它是搜索控制器中过滤器的一部分。

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

borrowable = ?, true一点是完全错误的。我想要的是通过使用被调用的方法来过滤@items借用的。Item's modelborrowable?

我该怎么做呢?

中的方法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
4

2 回答 2

2

如果它依赖于模型级代码,那么您将无法将其放在 where 子句中。where 子句试图获取项目列表,但在每个项目上您都想调用一个方法,但在获取项目之前您没有该方法。您可能会在数据库上使用存储过程,但仅在 Rails 代码中您可以这样做:

@items = @items.keep_if { |item| item.borrowable? } if params[:top_filter] == 'borrow'
于 2012-11-08T16:10:11.960 回答
1

你不能!ActiveRecord 对数据库进行查询,然后使用返回的数据构建对象。所以在返回数据之前,不存在 ruby​​ 对象,并且不能使用他们的方法。

如果您能够使用“计算”​​(在 SQL 意义上)表示相同的信息,那么您可以通过

@items.where("some sql condition/calculation")...
于 2012-11-08T16:10:23.927 回答