1

参照している ActiveRecord クラスを除いて同一のメソッドが 2 つあります。

def category_id_find(category_name)
  category = Category.find_by_name(category_name)
  if category != nil
    return category.id
  else
    return nil
  end
end

def brand_id_find(brand)
  brand = Brand.find_by_name(brand)
  if brand != nil
    return brand.id
  else
    return nil
  end
end

さて、これを組み合わせて、クラスと検索する文字列の 2 つの引数を取る何らかの種類の動的に作成されたメソッドにこれを組み合わせるには、より Railsy/Ruby の方法が必要であることを知っているので、次のようなものを試しました (そして失敗しました):

def id_find(class, to_find)
  thing = (class.capitalize).find_by_name(to_find)
  if thing.id != nil
    return thing.id
  else
    return nil
  end
end

つまり、私は電話をかけることができましたid_find(category, "Sports")

すべてのデータを含む単一のモンスター CSV ファイルからのシード中に、テーブルにデータを入力する必要があります。したがって、たとえば、CSV からすべての個別のカテゴリを取得し、それらをカテゴリ テーブルにパントしてから、入力されたばかりのカテゴリ テーブルの ID に基づいて各項目の category_id を割り当てる必要があります。

4

2 に答える 2

1

classは Ruby の予約済みキーワード (クラス宣言にのみ使用される) であるため、メソッド パラメーターに名前を付けるために使用することはできません。開発者はしばしばklass、この制限に衝突することなく元の意味を保持する に変更します。ただし、この場合、おそらくクラスの名前を文字列として渡すことになるので、私はそれを と呼びますclass_name

Rails の ActiveSupport には、文字列を定数に変換するために使用できる多数の組み込みメソッドがあります。CSV データがどのように見えるかに応じて、次のような結果になる可能性があります。

def id_find(class_name, to_find)
  thing = (class_name.camelize.constantize).find_by_name(to_find)
  ...
end
于 2013-06-20T21:49:15.073 に答える