0

Railsでは、最初の属性に応じて、アイテムのすべての属性を自動的に割り当てる方法を教えてください。

私の質問の最初の部分は上のリンクにあります、

@ ring.display_name = Ring :: DISPLAY_NAME.sampleの例を使用して、ランダムなプロパティを取得しました。問題ない。私を悩ませているのは、残りの属性を取得することです。

次に、display_nameにランダムに選択されたものに従って、@ ring.gold、@ ring.roll、および@ring.bonusを取得する必要があります。これが私のモデルの現在の外観です。それが間違っていることはわかっていますが、これを行うためのより良い方法があるかどうか教えていただけますか?おそらくうまくいく方法はありますか?

class Ring < ActiveRecord::Base



  # Display_name
  DISPLAY_NAME = [ 'Beginners', 'Silver', 'Gold', 'Diamond' ]

  # Gold
  if Ring.display_name == 'Beginners'
    GOLD = [ 0 ]
  end
  if Ring.display_name == 'Silver'
    GOLD = [ 0 ]
  end
  if Ring.display_name == 'Gold'
    GOLD = [ 0 ]
  end
  if Ring.display_name == 'Diamond'
    GOLD = [ 0 ]
  end


  # Roll
  if @ring.display_name == 'Beginners'
    ROLL = [ 1 ]
  end  
  if @ring.display_name == 'Silver'
    ROLL = [ 1, 2, 3 ]
  end
  if @ring.display_name == 'Gold'
    ROLL = [ 2, 3, 4 ]
  end
  if @ring.display_name == 'Diamond'
    ROLL = [ 4, 5, 6 ]
  end

  # Bonus
  if Ring.display_name == 'Beginners'
    BONUS = [ ring.user.level + 1 ]
  end  
  if Ring.display_name == 'Silver'
    BONUS = [ ring.user.level + (1 + rand(3)) ]
  end
  if Ring.display_name == 'Gold'
    BONUS = [ ring.user.level + (1 + rand(5)) ]
  end
  if Ring.display_name == 'Diamond'
    BONUS = [ ring.user.level + (1 + rand(8)) ]
  end

  attr_accessible :description, :display_name, :roll, :bonus, :total, :image, :gold


end

コードからわかるように、「ifRing.display_name」と「if@ ring.display_name」を使用してみました。これを読んでいる人は誰でも、うまくいかないことを知っていると思います。

ありがとう!

更新しました!

これが私が現在使用しているコードです。これは正しくありません、私はこのテクニックの使い方をよく理解していません。私が持っているものを見てください。

class Ring < ActiveRecord::Base

  # Display_name
  DISPLAY_NAME = [ 'Silver', 'Gold', 'Diamond' ]

  # Rolls
  ROLL = {
    'Silver'    => [1, 2, 3],
    'Gold'      => [2, 3, 4],
    'Diamond'   => [4, 5, 6]
  }
  self.roll = ROLL[self.display_name]

  BUY = {
    'Silver'    => [100..180],
    'Gold'      => [140..200],
    'Diamond'   => [180..350]
  }
  self.buy = BUY[self.display_name]

  BONUS = {
    'Silver'    => [(1 + rand(3))],
    'Gold'      => [(3 + rand(5))],
    'Diamond'   => [(5 + rand(8))]
  }
  self.bonus = BONUS[self.display_name].call

  attr_accessible :user, :active, :display_name, :description, :gold, :buy, :sell, :roll, :bonus, :total, :image, :description


end

そして私のコントローラーでは:

def create
    @ring = Ring.new
    @ring.display_name = Ring::DISPLAY_NAME.sample

    @ring.save

    redirect_to @ring
  end

私の理解では、ランダムなdisplay_nameを選択するように指示すると、他のすべてのフィールドは、モデルにあるものに従って入力されますが、それは正しいですか?

4

1 に答える 1

0

次のように、条件からハッシュを作成できます。

class Ring < ActiveRecord::Base

  # Display_name
  DISPLAY_NAME = [ 'Silver', 'Gold', 'Diamond' ]

  # Rolls
  ROLL = {
    'Silver'    => [1, 2, 3],
    'Gold'      => [2, 3, 4],
    'Diamond'   => [4, 5, 6]
  }

  BUY = {
    'Silver'    => [100..180],
    'Gold'      => [140..200],
    'Diamond'   => [180..350]
  }

  BONUS = {
    'Silver'    => ->(){(1 + rand(3))},
    'Gold'      => ->(){(3 + rand(5))},
    'Diamond'   => ->(){(5 + rand(8))}
  }

  attr_accessible :user, :active, :display_name, :description, :gold, :buy, :sell, :roll, :bonus, :total, :image, :description

  def display_name=(name)
    super(name)
    self.roll = ROLL[self.display_name]
    self.buy = BUY[self.display_name]
    self.bonus = BONUS[self.display_name].call
  end
end
于 2012-06-28T21:20:39.613 に答える