我对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
答案 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
然后您不需要任何方法,但在这种情况下,您无法将属性传递给模型创建。
答案 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看起来是复数,并且可能违反命名约定,并且可能导致某些问题,例如在运行时解析关联类等等。