【问题标题】:Factory Girl tries to access a table that does not exist when using Single Table InheritanceFactory Girl 尝试访问使用单表继承时不存在的表
【发布时间】:2015-02-07 22:46:28
【问题描述】:

这是我的场景:

我想在我的数据库中存储不同类型的事件。它们都共享相同的字段,但行为不同。因此我使用了单表继承。

事件的表定义如下:

class AddEvents < ActiveRecord::Migration
  def up
    create_table :events do |t|
      t.date :event_date
      t.string :type
      t.references :trackable , :polymorphic => true
    end
  end

  def down
    drop_table :events
  end
end

我的事件类看起来像这样(最小的工作示例):

class Event < ActiveRecord::Base

  self.abstract_class = true
  belongs_to :trackable, polymorphic: true

  [... some validation ] 
end

class View < Event; end
class Click < Event; end 
class Conversion < Event; end

表创建得很好。但是当我尝试打电话时:

@view1 = FactoryGirl.build(:view1)

:view1 定义如下:

factory :click1, class: Click do
  event_date TEST_CLICK_1_EVENT_DATE
end

我收到以下错误消息:

失败/错误:@view1 = FactoryGirl.build(:view1) ActiveRecord::StatementInvalid: Mysql2::Error: 表 'adserve_test.views' 不存在: SHOW FULL FIELDS FROM 'views'

我还尝试从控制台创建一个点击对象,这给了我同样的错误。任何想法如何解决这个问题?

【问题讨论】:

  • @shoji FactoryGirl 不应该是我认为的问题。因为我也尝试通过控制台创建一个新实例,它给了我同样的错误。

标签: ruby-on-rails single-table-inheritance


【解决方案1】:

问题出在Event 父类中的self.abstract_class=true。我完全忘记了 Rails 中的抽象类与 C# 或 Java 等语言完全不同。还是按照官网的说法:

抽象类
如果这是一个抽象类,请将其设置为 true(请参阅 abstract_class?)。如果您在 ActiveRecord 中使用继承,并且不希望子类使用父类的隐含 STI 表名,则必须为 true。

这 100% 不是我想要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多