0

我有这行代码来查找数据库中的行,或者创建一个新行。正在工作,但它看起来非常丑陋且难以维护。

return_policy_id= MyEbayReturnPolicy.find_or_create_by_active_and_name_and_ebay_marketplace_id_and_returns_within_and_returns_accepted_and_warranty_offered_and_warranty_duration_and_warranty_type_and_shipping_costs_paid_by_and_refunds(active,name,ebay_marketplace_id,returns_within,returns_accepted,warrenty_offered,warranty_duration,warranty_type,shipping_costs_paid_by,refunds)

这是 find_or_create 代码

 def self.find_or_create(search, *args, &block)
    parameters = search.split("_and_")
    params = Hash[ parameters.zip(args) ]
    obj = where(params).first 
    if(obj.nil?)
       obj = self.new(params);
       obj.save
    end
    return obj;
  end

如您所见,这是非常长的代码行。

我想知道是否有更好的方法让这段代码看起来漂亮干净,易于维护。

谢谢!

4

2 回答 2

3

Rails 3.2 引入了first_or_create(以及其他类似方法)。您可以利用它:

MyEbayReturnPolicy.where(
    active:                 active,
    name:                   name,
    ebay_marketplace_id:    ebay_marketplace_id,
    returns_within:         returns_within,
    returns_accepted:       returns_accepted,
    warranty_offered:       warranty_offered,
    warranty_duration:      warranty_duration,
    warranty_type:          warranty_type,
    shipping_costs_paid_by: shipping_costs_paid_by,
    refunds:                refunds
).first_or_create
于 2012-09-11T13:51:54.430 回答
1

根据我的建议条件太多,scope为上述属性创建您可以通过某种元编程方式来执行此操作也可以减少代码,首先通过链接范围找出是否找到然后返回或创建记录

于 2012-09-11T13:44:17.900 回答