2012-09-11 30 views
0

我有这行代码来查找数据库中的行或者创建一个新行。正在工作,但它看起来非常难看和难以维护。如何清理我的查找或在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 

正如你看到的是代码非常长的线。

我想知道是否有更好的方法来使这段代码看起来不错,很干净以便于维护。

谢谢!

+0

使用范围+ where子句。我确认它不可读 – apneadiving

+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

按我的建议 它太多的条件,创造scope以上属性可以通过某种元编程的方式做到这一点还可以减少代码, 首先通过链接范围看看它的发现,然后返回或创造纪录

相关问题