我有这行代码来查找数据库中的行,或者创建一个新行。正在工作,但它看起来非常丑陋,难以维护。
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 :(得分: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
,你可以通过某种元编程方式来减少代码,
首先通过链接范围找出它是否找到然后返回或创建记录