gpt4 book ai didi

ruby-on-rails - 在 Rails 中创建单表继承记录

转载 作者:行者123 更新时间:2023-12-04 07:02:38 25 4
gpt4 key购买 nike

我正在为我的应用程序使用单表继承。我的多态类型是 Maintenance,现在只有一个子类型,名为 OilChange。我在 Controller 的 create 方法中创建记录时遇到问题。这是代码。

@log = Log.new(params[:log])
@log.maintenance = Maintenance.new(params[:maintenance])

params[:maintenance] 散列有键 {:name, :type}。我可以通过如下打印来验证它们的存在和值
print params[:maintenance][:name]
print params[:maintenance][:type]

如果我为 :type 键的值传入“OilChange”,则维护记录的类型为维护而不是 OilChange。我可以通过在 REPL 控制台中查找记录来验证这一点。类型字段为零。通过添加以下行,我可以让它像我想要的那样工作。
@log.maintenance.type = params[:maintenance][:type]

但这很丑陋。我想知道的是,为什么 create 方法不像 name 字段刚刚找到的那样设置 type 字段?

您在我的 schema.rb 中看到的两种类型如下所示
create_table "logs", :force => true do |t|
t.date "date"
t.text "description"
t.string "title"
t.string "summary"
t.integer "car_id"
t.datetime "created_at"
t.datetime "updated_at"
t.integer "maintenance_id"
t.integer "mileage"
end

create_table "maintenances", :force => true do |t|
t.string "name"
t.string "type"
t.datetime "created_at"
t.datetime "updated_at"
t.string "oil_brand"
t.string "oil_type"
t.string "oil_filter_type"

我的模型看起来像这样。
class Log < ActiveRecord::Base
belongs_to :car
has_and_belongs_to_many :tags
belongs_to :maintenance
end

class Maintenance < ActiveRecord::Base
has_one :log
end

class OilChange < Maintenance
end

蒂亚!

最佳答案

具体答案是type属性,像许多 Rails 的特殊属性一样,不受批量赋值的影响。 (在文档中查找 :attr_protected。)

更普遍的问题的答案是您对模型的信任度不够。如果你想创建一个类型为 OilChange 的记录,你不应该调用 Maintenance.newMaintenance.create .调用 OilChange.newOilChange.create相反,Rails 会自动负责设置类型并为您完成所有后台工作。

关于ruby-on-rails - 在 Rails 中创建单表继承记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1600804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com