Ruby on Rails: как вы заполняете столбец * _type в полиморфных моделях? - PullRequest
0 голосов
/ 14 июля 2010

У меня есть много данных, которые я пытаюсь вставить в полиморфную модель в Rails 2.3.8. Все данные связаны с моделью округа. Данные выглядят так:

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 => County ведут к «неопределенному методу« base_class »для String: Class.»

У меня есть десятки тысяч этих значений, которые я хотел бы вставить в базу данных. Они аналогичны приведенным выше значениям, за исключением того, что некоторые связаны с моделью округа, некоторые с моделью штата, а некоторые с моделью города. Это статические значения, которые не будут редактироваться после заполнения базы данных.

Как мне заполнить модель в поле: 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 ]

2 голосов
/ 14 июля 2010

Вам определенно не нужен столбец «value» в вашей схеме - просто «value_id» и «value_type». Тогда ваши начальные данные должны выглядеть так:

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

Обратите внимание, что "County" - это строка в кавычках.

Другой альтернативой будет сделать это:

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

И тогда Rails автоматически установит для вас столбцы :value_type и :value_id на основе имени класса и идентификатора записи округа. Этот пример может дать вам лучшее представление о том, что происходит. Однако для тысяч записей это будет намного медленнее, поэтому первый подход, вероятно, лучше для этого случая.

1 голос
/ 14 июля 2010

Это происходит потому, что вы сделали это в своей модели:

belongs_to :value, :polymorphic => true

И потому, что вы пытаетесь установить столбец значений в таблице тоже. Rails не сможет определить разницу между установкой ассоциации или столбца с помощью этого метода. Чтобы установить столбец используйте это:

self[:value] = "something"
...