Factory Girl 尝试访问在使用 Single Table Inheritance 时不存在的 table
Factory Girl tries to access a table that does not exist when using Single Table Inheritance
这是我的场景:
我想在我的数据库中存储不同类型的事件。它们都共享相同的字段,但行为不同。因此我使用了 Single Table Inheritance.
事件的 table 定义如下所示:
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
table 创建得很好。但是当我尝试打电话时:
@view1 = FactoryGirl.build(:view1)
:view1
定义如下:
factory :click1, class: Click do
event_date TEST_CLICK_1_EVENT_DATE
end
我收到以下错误消息:
Failure/Error: @view1 = FactoryGirl.build(:view1)
ActiveRecord::StatementInvalid:
Mysql2::Error:Table 'adserve_test.views' 不存在:显示来自 'views'
的完整字段
我还尝试从控制台创建一个点击对象,这给了我同样的错误。有什么解决办法吗?
问题出在 Event
父 class 中的 self.abstract_class=true
。我完全忘记了 rails 中的抽象 class 与 C# 或 Java 等语言完全不同。或者如官网所说:
abstract_class
Set this to true if this is an abstract class (see abstract_class?). If you are using inheritance with ActiveRecord and don't want child classes to utilize the implied STI table name of the parent class, this will need to be true.
100% 不是我想要的。
这是我的场景:
我想在我的数据库中存储不同类型的事件。它们都共享相同的字段,但行为不同。因此我使用了 Single Table Inheritance.
事件的 table 定义如下所示:
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
table 创建得很好。但是当我尝试打电话时:
@view1 = FactoryGirl.build(:view1)
:view1
定义如下:
factory :click1, class: Click do
event_date TEST_CLICK_1_EVENT_DATE
end
我收到以下错误消息:
Failure/Error: @view1 = FactoryGirl.build(:view1) ActiveRecord::StatementInvalid: Mysql2::Error:Table 'adserve_test.views' 不存在:显示来自 'views'
的完整字段我还尝试从控制台创建一个点击对象,这给了我同样的错误。有什么解决办法吗?
问题出在 Event
父 class 中的 self.abstract_class=true
。我完全忘记了 rails 中的抽象 class 与 C# 或 Java 等语言完全不同。或者如官网所说:
abstract_class
Set this to true if this is an abstract class (see abstract_class?). If you are using inheritance with ActiveRecord and don't want child classes to utilize the implied STI table name of the parent class, this will need to be true.
100% 不是我想要的。