2010-07-13 2 views
0

У меня есть много данных, которые я пытаюсь засеять в полиморфную модель в Rails 2.3.8. Связь для всех данных связана с моделью округа. Данные выглядит следующим образом:Ruby on Rails: Как вы высеваете столбец * _type в полиморфных моделях?

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 => значение округа приводит к "неопределенному методу` base_class' для строки: Class."

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

Как засеять модель в поле: value_type?

(или ... я приближается это неправильно, и если да, то как бы вы подойти к нему?)

Edit: Соответствующая часть файла 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'}, 
+0

Можете ли вы разместить соответствующие части вашего schema.rb? – 2010-07-14 00:03:02

+3

Наличие значений 'value',' value_type' и 'value_id' не имеет смысла. Модель Datum будет использовать 'value_type' и' value_id', чтобы найти правильную запись в другой таблице, когда вы обращаетесь к ней с чем-то вроде 'somedatum.value' –

+0

Jamie - Я последовал примеру Obie« The Rails Way »на стр. 215, где в модели комментариев есть поля 'subject',' subject_id' и 'subject_type'. Модель Comment включает в себя 'belongs_to: subject,: polymorphic => true', а затем другие классы имеют' has_many: comments,: as =>: subject'. В моей модели Datum включена строка 'belongs_to: value,: polymorphic => true'. Моя модель округа включала строку 'has_many: data,: as =>: value'. – Clay

ответ

2

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

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

Обратите внимание, что «Графство» представляет собой строку в кавычках.

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

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

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

+0

Это, конечно, правильно, но для меня непонятно, что ОП пытается сделать с помощью:: value_id => 3103'' – 2010-07-14 04:18:52

+0

Основываясь на OP, я надеюсь и предполагаю, что у него есть запись округа с идентификатором 3103. Чтобы сделать эту работу, таблицы графства (и других потенциальных «Ценностей», например «Город, регион») должны были быть предварительно заполнены записями с теми идентификаторы. Если это не так, тогда требуется больше кода (что-то вроде ': value => County.new ([другие атрибуты округа здесь])' может работать). –

+0

Ник прав. Извините за путаницу с именованием. ': value' - это число населения. ': value_type' относится к другой модели в полиморфных отношениях - в данном случае, в округе. ': value_id' - идентификационный номер округа (предварительно заполненный). – Clay

1

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

belongs_to :value, :polymorphic => true 

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

self[:value] = "something" 
Смежные вопросы