在这种情况下如何处理质量分配

时间:2011-05-30 05:45:34

标签: ruby-on-rails

我有一个用户注册用户注册用户名,first_class和其他一些attribs。现在,我还需要设置一些其他属性,例如:str或:acc。

这些属性可能会在像mass这样的质量分配命令中设置。当然,我不想分别对每个人执行类似update_attribute的操作。因此,我必须使它们成为attr_accessible。

但是,我不希望用户设置它们。例如,如果用户决定拥有first_class ='Ranger',我会设置他的:str而不是他。

我的想法是,我只保存params [:first_class]或params [:username],并在我的create方法中为用户显式设置其他所有内容。这是你怎么做的?

2 个答案:

答案 0 :(得分:6)

我猜测其他属性是根据用户在注册过程中选择的内容预先确定的?

在这种情况下,我会在您的模型中添加一个before_create挂钩,以便相应地计算和分配这些属性:

class PlayerCharacter < ActiveRecord::Base
  before_create :assign_attributes

  # ...

  # This is called after you call "update_attributes" but before 
  # the record is persisted in the database
  def assign_attributes

    # Stats are determined by the 'first_class' attribute
    stats = case first_class
      when "Ranger"  then { :str => 20, :dex => 19, :wis => 8 }
      when "Wizard"  then { :str => 10, :dex => 14, :wis => 18 }
    end

    self.attributes.merge!(stats)
  end
end

答案 1 :(得分:2)

根据Dan的方法,你也可以为你的角色恕我直言添加一个新的“PlayerClass”模型。它可以与您的玩家或角色类具有belongs_to的关系,因此您可以拥有许多这样的关系。这样,如果您需要更多类,可以通过ui中的管理控件添加它,并将其直接添加到数据库中。

再接受一次:)