我在类1中有两个方法试图在数据库中查找记录并返回它(如果存在)。第二个方法仅在第一个没有找到任何结果时执行,并且它创建一个新记录使用new
ActiveRecord方法
有人建议我只用一个ActiveRecord调用替换这两个方法,但似乎无法找到方法。
方法:
def find_cart_item
@cartitem = @cart.cart_items.find_by product_id: @product.id
end
def create_cart_item
@cartitem = @cart.cart_items.new(quantity: 0, price: @product.price, product: @product)
end
有什么建议吗?
答案 0 :(得分:3)
如果您使用的是rails 4,则可以
@cart
.cart_items
.where(quantity: 0, price: @product.price, product_id: @product.id)
.first_or_initialize
如果要在数据库中创建对象,也可以使用find_or_create
如果您使用的是3或更低的轨道,则可以
@cart
.cart_items
.find_or_initialize_by_quantity_and_price_and_product_id(0, @product.price, @product.id)
如果要在数据库中创建对象,也可以使用find_or_create_by_quantity_and_price_and_product_id
答案 1 :(得分:2)
我认为你在寻找的是
Cart.find_or_create_by(product_id: @product.id) do |c|
c.quantity = 0
c.price = @product.price
end
有关详细说明,请参阅rails guides。
请注意,数量可能默认为零(为了使您的代码更清晰),因此要排除,但我已将其包括在内,因为您没有默认值。
答案 2 :(得分:1)
您可以使用first_or_create!
或first_or_initialize
Cart.first_or_create!(product_id: @product.id) do |ct|
ct.quantity = 0
ct.price = @product.price
ct.product_id @product.id
end
或
@cart.cart_items.where(quantity: 0, price: @product.price, product_id: @product.id)
.first_or_create!
另请参阅this了解10个最神奇的Active Record
查询。你会喜欢它!