我在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
的表,并在其上指定谁对谁强,但我不知道这是否是最佳方式。
答案 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
完全未经测试,但如果你想使用它,我们可以迭代