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 に答える