find_or_create_by - 不更新

时间:2015-05-07 16:32:59

标签: ruby-on-rails ruby activerecord

我想向我的控制器提交产品ID和零售商ID,如果数据库中存在的组合我想用提交的参数更新该记录,如果没有,则创建新记录。

我的控制器在下面,目前我可以看到,如果组合不存在,则创建记录,但是当找到组合时,它会执行选择查询并且记录不会更新。

如何让它更新而不只是选择?

由于

控制器:

      def AddNewPrice
            @newPrice = ProductPrice.find_or_create_by(product_id: params[:product_id], retailer_id: params[:retailer_id])                  
      end

更新

抱歉..只是提到,当我更新时,我想更新作为参数进来的价格属性

3 个答案:

答案 0 :(得分:4)

因为,它从方法名称中清楚地发现它匹配给定条件的记录匹配,或者使用product_id创建新记录,并且如果记录不存在则使用retailer_id。 你需要做一些这样的事情来更新记录

def add_new_price
  new_price = ProductPrice.find_or_create_by(product_id: params[:product_id], retailer_id: params[:retailer_id])
  new_price.update_attributes({attr: params[:attr]})
end

答案 1 :(得分:3)

与方法名称一样,找到对象(如果存在),创建,如果不存在。

如果您想更新某些内容,可以执行以下操作:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<input type="button" class="submit_wide" value="Submit"/>

答案 2 :(得分:2)

如果product_idretailer_id的组合不存在,您尝试执行的操作实际上是创建记录。如果确实存在那么就没事了......

如果要更新属性(如果存在则)或创建属性(如果不存在),您可以使用find_or_initialize_by以及update_attributes

def AddNewPrice
  @newPrice = ProductPrice.find_or_initialize_by(product_id: params[:product_id], retailer_id: params[:retailer_id])
  @newPrice.update_attributes(price: "updated value")                  
end