我有以下表格:
create_table "acs_objects", :force => true do |t|
#various attributes....
end
create_table "content_items", :force => true do |t|
t.integer "parent_id"
t.string "name" :limit => 400
end
在AR中,这种关系成立:class ContentItem< AcsObject
我的Rspec测试是:
require 'spec_helper'
describe ContentItem do
subject {Factory(:content_item)}
it {should be_valid}
end
如果我这样定义工厂:
Factory.define :content_item do |ci|
ci.sequence(:name) {|n| "Music#{n}"}
end
我收到错误:“parent_id”列中的空值违反了非空约束
如果我这样改变工厂:
Factory.define :content_item, :parent => :acs_object do |ci|
ci.sequence(:name) {|n| "Music#{n}"}
end
然后我收到了这个错误:
'ContentItem'中的NoMethodError 未定义的方法`name ='表示AcsObject:0xb3ee51e8
我之前使用过:父母,从来没有遇到过这个问题。 'name'显然属于ContentItem - 为什么我会收到此错误?
我很确定问题与content_items表被定义为视图以及父属和子属性的混合这一事实有关:
View definition:
SELECT parent.id, parent.object_type, parent.context_id, parent.security_inherit_p, parent.created_by, parent.created_at, parent.created_ip, parent.updated_at, parent.updated_by, parent.updated_ip, parent.context_tree_sortkey, parent.context_max_tree_sortkey, child.parent_id, child.name, child.locale, child.live_revision AS live_revision_id, child.latest_revision AS latest_revision_id, child.publish_status, child.content_type, child.storage_type, child.storage_area_key, child.tree_sortkey, child.max_child_sortkey
FROM acs_objects parent
JOIN cr_items child ON parent.id = child.item_id;
如果这确实是原因,有没有办法使用FactoryGirl并让它按预期工作?
更新:ContentItem工厂现在可以使用了。这是我所做的改变:
Factory.define :content_item do |ci|
ci.sequence(:name) {|n| "Music#{n}"}
ci.parent_id Factory(:acs_object).id
end
有更好的方法吗?
答案 0 :(得分:0)
factory_girl假定您在定义子工厂时要使用与父项相同的构建类。如果您不想这样做,可以在子定义中覆盖该类:
Factory.define :content_item, :parent => :acs_object, :class => "ContentItem" do |ci|
ci.sequence(:name) {|n| "Music#{n}"}
end