Rails创建记录时,插入belongs_to关联

时间:2014-07-01 06:46:19

标签: ruby-on-rails join associations

我对rails中的关联有疑问。情况如下:

型号:

class Character < ActiveRecord::Base
  has_one :character_stats
end

class CharacterStats < ActiveRecord::Base
  belongs_to :character
end

现在我需要在创建新角色时创建统计数据。

我现在做的是什么,我觉得这是一个使用rails的解决方法。还有更多&#34; raily&#34;这样做的方法?

  after_save :character_init  

  def character_init
    create_stats
  end

  def create_stats
    stats = CharacterStats.new
    stats.character_id = self.id // this bothers me!
    stats.save
  end

但我觉得应该有这样的事情:

stats.character << self

提前谢谢你:)

编辑:

这是我的模型在现实生活中的样子:

def create_stats
    race_stats = Race.find(race_id).race_stats
    class_stats = RaceClass.find(race_class_id).class_stats
    stats = CharacterStats.new
    stats.character_id = self.id
    stats.health = race_stats.health + class_stats.health
    stats.mana = race_stats.mana + class_stats.mana
    stats.intellect = race_stats.intellect + class_stats.intellect
    stats.armor = race_stats.armor + class_stats.armor
    stats.magic_resist = race_stats.magic_resist + class_stats.magic_resist
    stats.attack = race_stats.attack + class_stats.attack
    stats.defence = race_stats.defence + class_stats.defence
    stats.save
    self.character_stats_id = stats.id
  end

2 个答案:

答案 0 :(得分:2)

首先,如果您想在创建CharacterStats之后创建Character,请使用after_create回调。关于您的问题,您可以使用ActiveRecord方法(create_character_stats创建模型)和build_character_stats初始化模型。因此,您可以将create_stats方法更改为此类

def create_stats
  self.create_character_stats
end

或者您可以将之后的回调更改为此

after_create :create_character_stats

然后您不需要任何方法,但在这种情况下,您无法将属性传递给模型创建。

此处提到的问题Using build with a has_one association in rails

答案 1 :(得分:1)

以rails方式,您可以使用build_association方法refer doc。此外,只有在创建父对象时才应创建关联,因此请使用after_create回调

class Character < ActiveRecord::Base
  has_one :character_stats

 after_create :create_stats

 def create_stats
    state = self.build_character_stats({}) # empty hash as you are not passing any attributes   
    state.save
 end

end

此外,模型名称CharacterStats看起来是复数,并且可能违反命名约定,并且可能导致某些问题,例如在运行时解析关联类等等。