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句はアイテムのリストを取得しようとしていますが、各アイテムでメソッドを呼び出したいのですが、アイテムを取得するまでメソッドはありません。DBでストアドプロシージャを使用できる可能性がありますが、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 に答える