如何在rails中清理我的查找或创建代码

时间:2012-09-11 13:38:47

标签: ruby-on-rails

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

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

正如您所看到的那样,代码非常长。

我想知道是否有一种更好的方法可以让这段代码看起来很干净,而且很容易维护。

谢谢!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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