Ruby on rails rails ActiveRecord查找或创建

Ruby on rails rails ActiveRecord查找或创建,ruby-on-rails,rails-activerecord,Ruby On Rails,Rails Activerecord,我在一个类中有两个方法,第一个方法尝试在数据库中查找记录并返回它(如果它存在)。第二个方法仅在第一个方法未找到任何结果时执行,并且它使用newActiveRecord方法创建一个新记录 有人建议我可以用一个ActiveRecord调用来替换这两种方法,但我似乎无法找到方法 方法: def find_cart_item @cartitem = @cart.cart_items.find_by product_id: @product.id end def create_cart_item @

我在一个类中有两个方法,第一个方法尝试在数据库中查找记录并返回它(如果它存在)。第二个方法仅在第一个方法未找到任何结果时执行,并且它使用
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

有什么建议吗

如果您使用的是rails 4,您可以

@cart
.cart_items
.where(quantity: 0, price: @product.price, product_id: @product.id)
.first_or_initialize
@cart
.cart_items
.find_or_initialize_by_quantity_and_price_and_product_id(0, @product.price, @product.id)
如果要在数据库中创建对象,也可以使用
find\u或\u create

如果您使用的是rails 3或更低版本,您可以

@cart
.cart_items
.where(quantity: 0, price: @product.price, product_id: @product.id)
.first_or_initialize
@cart
.cart_items
.find_or_initialize_by_quantity_and_price_and_product_id(0, @product.price, @product.id)

如果您想在数据库中创建对象,还可以使用
按数量、价格和产品id查找或创建

@cart
.cart_items
.where(quantity: 0, price: @product.price, product_id: @product.id)
.first_or_initialize
@cart
.cart_items
.find_or_initialize_by_quantity_and_price_and_product_id(0, @product.price, @product.id)
如果要在数据库中创建对象,也可以使用
find\u或\u create

如果您使用的是rails 3或更低版本,您可以

@cart
.cart_items
.where(quantity: 0, price: @product.price, product_id: @product.id)
.first_or_initialize
@cart
.cart_items
.find_or_initialize_by_quantity_and_price_and_product_id(0, @product.price, @product.id)

如果要在数据库中创建对象,也可以使用
按数量、价格和产品id查找或创建

Cart.find_or_create_by(product_id: @product.id) do |c|
  c.quantity = 0 
  c.price = @product.price
end
有关详细说明,请参见


请注意,数量可能默认为零(以使代码更干净),因此被排除在外,但我已将其包括在内,以防您没有默认值。

我认为您需要的是

Cart.find_or_create_by(product_id: @product.id) do |c|
  c.quantity = 0 
  c.price = @product.price
end
有关详细说明,请参见


请注意,数量可能默认为零(以使代码更干净),因此被排除在外,但我已将其包括在内,以防您没有默认值。

您可以使用
first\u或\u create
首先\u或\u初始化

Cart.first_or_create!(product_id: @product.id) do |ct|
  ct.quantity = 0 
  ct.price = @product.price
  ct.product_id @product.id
end


还有10个最神奇的
活动记录查询。你会喜欢的

您可以先使用
或创建
首先\u或\u初始化

Cart.first_or_create!(product_id: @product.id) do |ct|
  ct.quantity = 0 
  ct.price = @product.price
  ct.product_id @product.id
end


还有10个最神奇的
活动记录查询。你会喜欢的

为什么不
find\u或\u create\u by
?@emaillenin:OP只是尝试初始化行\u项,稍作修改第一个答案按我的要求工作。thanx为什么不
find\u或\u create\u by
?@emaillenin:OP只是尝试初始化行\u项,稍作修改第一个答案按我的要求工作。thanx