Ruby on Rails:如何在多态模型中播种* _type列?

时间:2010-07-13 23:30:24

标签: ruby-on-rails ruby seed polymorphism

我有很多数据,我正试图在Rails 2.3.8中使用多态模型。所有数据的关联都与County模型有关。数据如下:

data = Datum.create([
  ...
  { :value => '14389', :value_type => County, :value_id =>'3103'},
  { :value => '59013', :value_type => County, :value_id =>'3105'},
  { :value => '17117', :value_type => County, :value_id =>'3106'},
  ...
])

:value_type =>县值导致“String:Class的未定义方法`base_class”。“

我有数以万计的这些值,我想在数据库中播种。它们类似于上面的值,除了一些与County模型相关联,一些与State模型相关,一些与City模型相关。它们是静态值,在播种到数据库后不会被编辑。

如何将模型植入:value_type字段?

(或......我接近这个错误,如果是这样,你会怎么接近它?)

编辑:schema.rb文件的相关部分:

艾萨克 -

create_table "data", :force => true do |t|
  t.integer  "value"
  t.string   "value_type"
  t.integer  "value_id"
  t.datetime "created_at"
  t.datetime "updated_at"
end

create_table "counties", :force => true do |t|
  t.string   "name"
  t.integer  "state_id"
  t.integer  "ansi_code"
  t.string   "ansi_class"
  t.datetime "created_at"
  t.datetime "updated_at"
end

我也在播种时尝试了以下操作,但它没有用(引用县):

{ :value => '14389', :value_type => 'County', :value_id =>'3103'},

2 个答案:

答案 0 :(得分:2)

您绝对不需要架构中的“值”列 - 只需“value_id”和“value_type”。然后您的种子数据应如下所示:

...
{ :value_id => 12345, :value_type => "County" },
...

请注意,“县”是引号中的字符串。

另一种选择是:

{ :value => County.find(12345) }

然后Rails会根据县记录的类名和ID自动为您设置:value_type:value_id列。这个例子可以让你更好地了解发生了什么。但是,对于成千上万的记录来说,这会慢很多,所以第一种方法可能更适合这种情况。

答案 1 :(得分:1)

这种情况正在发生,因为您已在模型中完成此操作:

belongs_to :value, :polymorphic => true

因为你也试图在表格上设置值列。 Rails将无法区分您通过此方法设置关联或列。要设置列,请使用:

self[:value] = "something"