0

Rakeタスクcurretnylにいくつかのサンプルデータを入力するには、次のようなメソッドがあります。

def create_population_summaries
  PopulationSummary.where(year: 2009).first_or_create(member_count: 12, organization_id: 1)
  PopulationSummary.where(year: 2010).first_or_create(member_count: 5, organization_id: 1)
  PopulationSummary.where(year: 2011).first_or_create(member_count: 99, organization_id: 1)
  PopulationSummary.where(year: 2008).first_or_create(member_count: 52, organization_id: 1)
  PopulationSummary.where(year: 2012).first_or_create(member_count: 30, organization_id: 1)
  PopulationSummary.where(year: 2013).first_or_create(member_count: 25, organization_id: 1)
  PopulationSummary.where(year: 2008).first_or_create(member_count: 46, organization_id: 1)
end

つまり、次のような列を持つPopulationSummaryテーブルがあることを意味します

member_count
year
organization_id

そして、私たちは彼らにそのボスのデータを投入しました!私に与えました。

ここで、ハッシュ、配列、ハッシュの配列など、いくつかのRuby構造を使用する方法でこれをリファクタリングしたいと思います。リファクタリング後、メソッド内に手動で入力されたデータと手動で入力されたデータが含まれないようにします。そのRuby構造、ハッシュなどから取得する必要があります...まだメソッド内で、year、member_countなどのデータベースのフィールドの名前を手動で入力できますが、読み取りたい値の値ルビーのデータ構造..

そのデータ構造をどのように書くことを提案しますか?

4

3 に答える 3

1
data = [{'year'=>2009, 'members'=>12}, {'year'=>2010, 'members'=>5}....]

その後、ループします

data.each do |d|
  PopulationSummary.where(year: d['year']).first_or_create(member_count: d['members'], organization_id: 1)   
end
于 2013-02-16T17:51:04.643 に答える
1

次のようなものはどうですか?

DATA = [[ 2009, 12, 1], 
        [ 2010,  5, 1], 
       ... ]

DATA.each do |d|
  PopulationSummary.where(year: d[0]).first_or_create(member_count: d[1], organization_id: d[2])
end
于 2013-02-16T17:56:22.277 に答える
1

好奇心から、メタプログラミング(ビジネスルール、上司から来たもの)と母集団自体を完全に分離することができます。

data = [ {
           'year'=>2009,'members'=>12,'organization_id'=>1
         }, {
           'year'=>2010,'members'=>5,'organization_id'=>1
         }, {
           …
       } ]

そして、データを入力します。

data.each do |d| 
  d.inject (PopulationSummary) do |rec, val|
    rec.where val
  end.first_or_create
end

しかし、上司がデータの新しい部分をもたらす数か月後に、このヒントを嫌うのではないかと思います。

于 2013-02-17T01:02:27.707 に答える