自引用模型

时间:2014-04-15 00:31:45

标签: ruby-on-rails ruby

我在Ruby On Rails中创建一个简单的游戏,我必须创建一个自己引用的模型。

寻找示例:

class CreateElements < ActiveRecord::Migration
  def change
    create_table :elements do |t|
        t.string :name, limit: 48, null: false, default: ''
        t.integer :strong_against, null: false, default: 0
        t.integer :weak_against, null: false, default: 0

      t.timestamps
    end
  end
end

我的游戏中会有一些元素,如Fire和Water。水对闪电很弱但对火很强。我想要的是引用/关联模型/迁移本身。

我的意思是,在视图中我想这样做:

@element.strong_against.name

我的想法

我想知道创建一个名为elements_behavior的表,并在其上指定谁对谁强,但我不知道这是否是最佳方式。

1 个答案:

答案 0 :(得分:1)

我有更好的主意 - STI

#app/models/element.rb
Class Element < ActiveRecord::Base
    has_many :element_properties #-> join model

    has_many :strengths, -> { where(type: "Strength") } through: :element_properties
    has_many :weaknesses, -> { where(type: "Weakness") }, through: :element_properties
    #schema id | name | created_at | updated_at
end

#app/models/element_property.rb
Class ElementProperty < ActiveRecord::Base
    belongs_to :owner
    belongs_to :property

    #schema: id | type | element_id | property_id | created_at | updated_at
    #type should populate with "Strength" / "Weakness", and then delegate custom actions to STI
end

#app/models/strength.rb
Class Strength < ElementProperty
    #Custom actions (power_points? / custom levels?)
end

#app/models/weakness.rb
Class Weakness < ElementProperty
    #Custom actions (power_points? / custom levels?)
end

#-> @element.strengths.first.name
#-> @element.weaknesses.first.name

完全未经测试,但如果你想使用它,我们可以迭代