rails ActiveRecord查找或创建

时间:2014-03-18 15:49:02

标签: ruby-on-rails rails-activerecord

我在类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

有什么建议吗?

3 个答案:

答案 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查询。你会喜欢它!