2014-10-26 3 views
12

Просто пытаются спасти с ActiveRecord и я получаю «TypeError: ноль не является символом»TypeError: ноль не является символом

if card_data[:card] and card_data[:deck] 
    e = self.find_or_create_by(card_id: card_data[:card].id, deck_id: card_data[:deck].id, main: main) 
    e.card = card_data[:card] 
    e.deck = card_data[:deck] 
    e.quantity = card_data[:quantity].to_i 
    e.main = main 
    p e 
    e.save if e.card and e.deck 
end 

Я бегу приведенный выше код.

Схема:

create_table "entries", id: false, force: true do |t| 
    t.integer "card_id" 
    t.integer "deck_id" 
    t.integer "quantity", default: 0, null: false 
    t.integer "main",  default: 0, null: false 
    t.datetime "created_at" 
    t.datetime "updated_at" 
end 

Когда я использую совать нос, он не позволит мне e.save даже сразу после того, как я find_or_create_by.

#<Entry card_id: 1, deck_id: 1, quantity: 4, main: 1, created_at: "2014-10-26 00:45:12", updated_at: "2014-10-26 00:45:12"> 
(0.2ms) BEGIN 
(0.2ms) ROLLBACK 
TypeError: nil is not a symbol 
from /home/kevin/.rvm/gems/ruby-2.1.2/gems/activemodel-4.1.6/lib/active_model/dirty.rb:162:in `attribute_was' 

Прошу вас, помощь. Я потратил несколько часов на это. Я пробовал mysql insteal sqlite. Я пробовал разные типы данных столбцов. Вопрос - это поле «количество». Это не позволит мне сэкономить.

Редактировать: переменная 'main' установлена ​​выше того, что показано.

+1

Как и в сторону, вы не должны использовать 'and' и 'или' вместо '&&' и '||'. Они не то же самое. См. Https://github.com/bbatsov/ruby-style-guide#no-and-or-or – meagar

ответ

29

Хорошо, я наконец нашел ответ. Я сделал таблицу соединений, «записи» без поля id. Это требуется, если использовать таблицу соединений в качестве модели с дополнительными данными.

+1

Было ли это документировано в любом месте? Я попытался сделать то же самое с моими таблицами соединений, но я все равно получаю ту же ошибку. Кроме того, вы, вероятно, должны принять свой собственный ответ. –

+2

Это нигде не упоминается ни в одной документации, которую я прочитал, и я широко ее изучил, так как меня беспокоили проблемы в течение последних двух дней. У меня была таблица соединений, которая использовала 'has_and_belongs_to_many' для связи, которую я перенесла на' has_many: through'; в таблице объединений все еще не было никакого «id», поэтому никаких попыток обновления записей не удалось. Теперь я знаю, почему это произошло, и я надеюсь, что Google приносит другим пользователям ту же проблему, что и результат №1. –

+2

Кроме того, если вы не хотите добавлять первичный ключ, вы можете использовать метод 'update_all' - [см. Здесь] (http://stackoverflow.com/questions/13263188/how-do-you-update-a- нарисуйте таблицы записей с-не-первичных клавиш-в-рельсы). Если вы пытаетесь обновить определенную запись, сначала вы можете сделать предложение 'where', а затем' update_all'. – Robert

1

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

class AddIdToMyTable < ActiveRecord::Migration def change add_column :my_table, :id, :primary_key end end

Смежные вопросы