如何将其重写为ActiveRecord查询? (导轨)

时间:2012-07-27 06:49:00

标签: ruby-on-rails database activerecord

我在控制器中有以下方法:

# 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。用户有许多ProductInstances。每个ProductInstance都映射到一个产品。一个单位有很多产品。

我想只获取链接到当前单位中的产品的用户的ProductInstances。目前的代码可以做到,但我怎样才能更好地重写呢?我想摆脱for-each循环和if语句,并用链接的ActiveRecord查询替换它,如果可能的话。

我尝试了类似下面的内容,但它不起作用:

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

似乎你做不到:product.unit

1 个答案:

答案 0 :(得分: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})