首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在rails中,我如何才能做到最好?模型样本需要根据第一个模型属性随机化。

在rails中,我如何才能做到最好?模型样本需要根据第一个模型属性随机化。
EN

Stack Overflow用户
提问于 2012-06-28 20:52:50
回答 1查看 61关注 0票数 0

In Rails, how do you assign all attributes of an item automatically depending on the first attribute

我问题的第一部分是上面的链接,

我使用示例@ring.display_name = Ring::DISPLAY_NAME.sample获取了一个随机属性。这不是问题。困扰我的是抓住其余的属性。

现在我需要根据随机选择的@ring.gold、@ring.roll和@ring.bonus来获取display_name。现在看看我的模型,我知道这是错误的,但是你能告诉我是否有更好的方法来做这个,一个也许有效的方法?

代码语言:javascript
复制
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

正如您可以从代码中看到的那样,我尝试使用'if Ring.display_name‘和'if @ring.display_name’--这两种方法都不起作用,因为我想,不管是谁读了这篇文章,都知道他们不会这么做。

谢谢!

更新了!

这是我目前正在使用的代码。这是不对的,我不太明白如何使用这种技术。看看我有什么。

代码语言:javascript
复制
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

在我的控制器里:

代码语言:javascript
复制
def create
    @ring = Ring.new
    @ring.display_name = Ring::DISPLAY_NAME.sample

    @ring.save

    redirect_to @ring
  end

按照我的理解,如果我告诉它选择一个随机的display_name,所有其他的字段都将根据我在模型中的内容填充,对吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-28 21:20:39

您可以根据条件进行散列,如下所示:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11252705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档