【问题标题】:Rails when creating record, inserting belongs_to associationRails在创建记录时,插入belongs_to关联
【发布时间】:2014-08-21 15:24:40
【问题描述】:

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

型号:

class Character < ActiveRecord::Base
  has_one :character_stats
end

class CharacterStats < ActiveRecord::Base
  belongs_to :character
end

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

我现在要做的是,我觉得这是使用 rails 的一种解决方法。有没有更“轻松”的方式来做到这一点?

  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

【问题讨论】:

    标签: ruby-on-rails join associations


    【解决方案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 看起来是复数,这可能违反命名约定,并可能导致一些问题,例如在运行时解析关联类等。

    【讨论】:

      【解决方案2】:

      首先,如果您想在创建Character 之后创建CharacterStats,请使用after_create 回调。关于您的问题,您可以使用类似于 create_character_stats 的 ActiveRecord 方法创建模型,使用 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

      【讨论】:

      • 这很有用,但我必须传递参数...我将为此编辑我的帖子...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-25
      相关资源
      最近更新 更多