FactoryGirl使用:parent =>关联失败

时间:2012-01-27 18:23:12

标签: ruby-on-rails factory-bot

我有以下表格:

  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

有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

factory_girl假定您在定义子工厂时要使用与父项相同的构建类。如果您不想这样做,可以在子定义中覆盖该类:

Factory.define :content_item, :parent => :acs_object, :class => "ContentItem" do |ci|
  ci.sequence(:name) {|n| "Music#{n}"}
end