无效的单表继承类型..不是它的子类

时间:2014-03-29 15:09:11

标签: ruby-on-rails ruby-on-rails-4

我正在尝试记录用户通过用户和交易之间的多对多关系进行的每次购买,并通过连接表" transactuins_users"将它们链接起来。但我有两个问题,首先,我需要提供创建!对于被称为id的对象的方法,我认为Rails应该在给定关联的情况下自己解决这个问题。

此外,每当我调用购买方法时,我都会收到错误"无效的单表继承类型:buy不是Transaction"

的子类
class User < ActiveRecord::Base

  # Associations
  has_and_belongs_to_many :transactions

  def purchase(package)
    return false unless funds_available?(package) and !owns?(package)
      package.with_lock do

      # Makes transaction
      package.user_id = id
      package.save!
      withdraw(package.cost)

      # Records transaction
      values = {user_id: id, type: "buy", cost: package.cost}
      transactions.create values
    end
  end


class Transaction < ActiveRecord::Base

  # Associations 
  has_and_belongs_to_many :transactions

  # Validations
  validates :user_id, :cost, presence: true

3 个答案:

答案 0 :(得分:13)

Active Record有一定的schema conventions用于不同的行为。其中一个惯例是使用列名称&#34; type&#34;当您想在模型中使用单表继承时。看起来您并不打算使用STI,因此我建议您只需将列的名称更改为其他内容,例如&#34; kind&#34;或&#34;类别&#34;。

如果计划对各种类型的事务使用不同的行为,则可能需要考虑使用单表继承。

答案 1 :(得分:9)

self.inheritance_column = nil添加到您的模型中。类型是保留的。这将允许您使用它。

答案 2 :(得分:1)

我有同样的错误。你现在必须已经解决了它,但万一其他人正在寻找它,我的字段名为type,与问题相同。

type是保留字并用于继承。因此,当您使用type: "buy"时,它会尝试查找buy模型,并期望从User继承buy模型。

我会分享我的日志以便更好地理解:

Parameters: {"step"=>{"type"=>"Email Template", "step_name"=>"Step name", "no_of_days"=>20, "cadence_id"=>nil, "email_template_id"=>nil}}

Completed 500 Internal Server Error in 238ms

ActiveRecord::SubclassNotFound (Invalid single-table inheritance type: Email Template is not a subclass of Step):
   app/controllers/steps_controller.rb:15:in `create'

如果您仍然需要将字段名称保留为type,我相信将self.inheritance_column = nil添加到user模型可能有所帮助。避风港试过了。虽然我的建议是遵循rails惯例并避免它。

您可以找到更多详情here

希望这有助于某人。干杯:)