Activerecord Rails 6子类don';t自动创建自己的类型
在tuto()之后,我创建了一个类和子类:Activerecord Rails 6子类don';t自动创建自己的类型,activerecord,ruby-on-rails-6,single-table-inheritance,Activerecord,Ruby On Rails 6,Single Table Inheritance,在tuto()之后,我创建了一个类和子类: class Animal < ApplicationRecord belongs_to :tribe self.inheritance_column :race scope :lions, -> { where(race: 'Lion') } scope :meerkats, -> { where(race: 'Meerkat') } scope :wildboars, -> { where(race: '
class Animal < ApplicationRecord
belongs_to :tribe
self.inheritance_column :race
scope :lions, -> { where(race: 'Lion') }
scope :meerkats, -> { where(race: 'Meerkat') }
scope :wildboars, -> { where(race: 'Wildboar') }
def self.races
%w(Lion Wildboar Meerkat)
end
end
class动物{where(种族:'Lion')}
范围:猫鼬,->{where(种族:'Meerkat')}
经营范围:野猪,->{where(种族:'野猪')}
自我竞赛
%w(狮子、野猪、猫鼬)
结束
结束
和子类:
lion.rb
class Lion < Animal;end
meerkat.rb
class Meerkat < Animal; end
wildboar.rb
class Wildboar < Animal;end
lion.rb
狮子类动物;结束
猫鼬
猫鼬类<动物;结束
野猪
野猪类<动物;结束
还有一个与动物相关的课程:
class Tribe < ApplicationRecord
has_many :animals
# delegate :lions, :meerkats, :wild_boars, to: :animals
delegate :lions, :meerkats, :wildboars, to: :animals
end
类应用程序记录
你有很多动物吗
#代表:狮子、猫鼬、野猪、动物
代表:狮子,:猫鼬,:野猪,致::动物
结束
似乎是在图图中实现的种族,但当我创建Lion实例时,实例种族为零:
Lion.new
=> #<Lion id: nil, name: nil, age: nil, race: nil, created_at: nil, updated_at: nil, tribe_id: nil>
Lion.new
=> #
在现有部落中创建时也是如此:
tribe.animals << Lion.new(name:'toto',age:25)
(0.2ms) BEGIN
Lion Create (1.8ms) INSERT INTO "animals" ("name", "age", "created_at", "updated_at", "tribe_id") VALUES ($1, $2, $3, $4, $5) RETURNING "id" [["name", "toto"], ["age", 25], ["created_at", "2020-06-28 02:03:56.598482"], ["updated_at", "2020-06-28 02:03:56.598482"], ["tribe_id", 1]]
(6.9ms) COMMIT
Animal Load (0.6ms) SELECT "animals".* FROM "animals" WHERE "animals"."tribe_id" = $1 LIMIT $2 [["tribe_id", 1], ["LIMIT", 11]]
=> #<ActiveRecord::Associations::CollectionProxy [#<Animal id: 7, name: nil, age: nil, race: nil, created_at: "2020-06-27 23:59:30", updated_at: "2020-06-27 23:59:30", tribe_id: 1>, #<Animal id: 9, name: nil, age: nil, race: nil, created_at: "2020-06-28 00:16:43", updated_at: "2020-06-28 00:16:43", tribe_id: 1>, #<Animal id: 10, name: "toto", age: 25, race: nil, created_at: "2020-06-28 02:03:56", updated_at: "2020-06-28 02:03:56", tribe_id: 1>]>
部落动物#
这样做缺少什么?正如塞巴斯蒂安·帕尔马(Sebastian Palma)在通信中提到的那样,这是一个语法错误:
self.inheritance_column = :race
=
丢失了正如Sebastian Palma所提到的一个comm,对此的修复是一个语法错误:
self.inheritance_column = :race
=
缺失有self.heritation\u列:种族
打字错误?它应该是self.heritation\u column=:race
(没有=它应该抛出一个错误)。再次感谢您Sebastian Palma!我花了很多时间在这样一个荒谬的语法错误上。然后我注意到Lion.new足以在DB中创建实例。不需要。保存或创建。是这样吗?很好的一个,即使是一个小错误,我认为值得添加您的答案。性传播感染源于Rails文档不够强大的东西。我认为在这种情况下你必须注意。为了在数据库中创建新记录,必须采取措施将对象数据持久化到数据库中new
本身并不这样做,它只实例化给定类中的一个新对象,但是当您使用时,很好地了解了,很好的指示!是否有self.heritation\u列:种族
输入错误?它应该是self.heritation\u column=:race
(没有=它应该抛出一个错误)。再次感谢您Sebastian Palma!我花了很多时间在这样一个荒谬的语法错误上。然后我注意到Lion.new足以在DB中创建实例。不需要。保存或创建。是这样吗?很好的一个,即使是一个小错误,我认为值得添加您的答案。性传播感染源于Rails文档不够强大的东西。我认为在这种情况下你必须注意。为了在数据库中创建新记录,必须采取措施将对象数据持久化到数据库中new
本身并不这样做,它只实例化给定类中的一个新对象,但是当您使用时,很好地了解了,很好的指示!