gpt4 book ai didi

ruby-on-rails - rails : unknown attribute error for derived class

转载 作者:行者123 更新时间:2023-12-02 07:06:47 29 4
gpt4 key购买 nike

我有一个名为 PaypalPayment 的模型:

class PaypalPayment < PaymentMethod
belongs_to :order
def provider_class
PaypalPayment
end

def process!
end
end

我为其生成了以下迁移:

class CreatePaypalPayments < ActiveRecord::Migration
def change
create_table :paypal_payments do |t|
t.integer :order_id
t.integer :payment_id

t.timestamps
end
end
end

class AddDetailsToPaypalPayment < ActiveRecord::Migration
def change
add_column :paypal_payments, :state, :string
add_column :paypal_payments, :amount, :decimal
add_column :paypal_payments, :cc, :string
add_column :paypal_payments, :cm, :string
end
end

迁移后,表格看起来像这样:

development_database=# select * from paypal_payments;
id | order_id | payment_id | created_at | updated_at | state | amount | cc | cm

但是当我尝试初始化此模型的对象时,我得到了未知属性: payment_id

@paypal_payment = PaypalPayment.new(:payment_id => params[:tx], :state => params[:st], :cc => params[:cc], :cm => params[:cm], :order_id => params[:id])

编辑: db/schema.rb:

create_table "paypal_payments", :force => true do |t| 
t.integer "order_id"
t.integer "payment_id"
t.datetime "created_at"
t.datetime "updated_at"
t.string "state"
t.decimal "amount"
t.string "cc"
t.string "cm"
end

最佳答案

在关系数据库中建模继承有不同的方法,Martin Fowler 列出了以下选项:

  1. Single Table Inheritance :所有类都存储在一个表中
  2. Class Table Inheritance : 所有类都有自己的表
  3. Concrete Table Inheritance :只有具体类才有表(例如,在您的示例中 PaymentMethod 如果是抽象的,则不会有表)

现在 ActiveRecord only supports STI :单表继承。

所以如果你写

class PaypalPayment < PaymentMethod

ActiveRecord 将采用 STI 并查找类型列,此外,只会查找 payment_methods 表。

根据您的需求,在大多数情况下,性传播感染是完美的。有时我更喜欢类和具体表继承,但特别是对于关联,这需要更多的家务,因为:

  • 例如您有不同的付款方式,但它们存储在不同的表中
  • 您想一次性访问所有付款方式吗,您需要“抽象类”
  • 您需要针对每种可能的付款方式建立关联
  • 如果您有“抽象类”,如何链接到“真实付款方式”。一种方法是包含表名和子项的 id 作为链接。

有很多方法可以解决这个问题,但总是比使用单个表更困难。此外,这还扩展了关系数据模型,因为根据所选的解决方案,不会自动支持外键约束。我可以详细说一下,但我不确定这是否相关,因为你的例子似乎是性传播感染的典型案例。

如果您确实想使用类表继承或具体表继承,则每个类都必须从“ActiveRecord::Base”派生,并且如果需要,您应该包含一个具有共享行为的模块(或关注点)(因为 ruby​​ 不这样做)不支持多重继承)。

关于ruby-on-rails - rails : unknown attribute error for derived class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23333779/

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