1

コントローラーに次のメソッドがあります。

# GET /units/1
def show
    @unit = Unit.find(params[:id]

    @product_instances = Array.new
    current_user.product_instances.each do |product_instance|
        if product_instance.product.unit == @unit
            @product_instances.push(product_instance)
        end
    end

    ... #rest of method
end

ご覧のとおり、User、Product、ProductInstance、および Unit の 4 つのテーブル/モデルがあります。ユーザーには多くの ProductInstances があります。各 ProductInstance は Product にマップされます。ユニットには多くの製品があります。

現在のユニットの製品にリンクされているユーザーの製品インスタンスのみを取得したいと考えています。現在のコードはそれを行っていますが、どうすればより良く書き直すことができますか? 可能であれば、for-each ループと if ステートメントを取り除き、連鎖した ActiveRecord クエリに置き換えたいと考えています。

以下のようなことを試しましたが、うまくいきませんでした。

@product_instances = current_user.product_instances.where(:product.unit => @unit)

できないようです:product.unit

4

1 に答える 1

1

私はあなたがこれを試すことができると思います

current_user.product_instances.joins(:product).where("products.unit_id = ?",@unit.id)

またはハッシュ付き

current_user.product_instances.joins(:product).where(:products => {:unit_id => @unit.id})
于 2012-07-27T06:56:47.463 に答える