Rails Activerecord. Создать странную нулевую ошибку - PullRequest
0 голосов
/ 02 августа 2011

Странная нулевая ошибка.

У меня есть сценарий рейка / lib / task, который отказывается устанавливать строковое значение, когда я запускаю его, rake сообщает об этом выводе / ошибке:

Покупка

Покупка

PGError: ОШИБКА: нулевое значение в столбце "тип" нарушает ненулевое ограничение: INSERT INTO "account_logs" ("сумма", "тип", "тип пользователя", "транзакция_id","commited", "user_id", "creation_at", "updated_at") ЗНАЧЕНИЯ (168.0, NULL, 'Public', 452921, 't', 10146, '2011-07-29 09: 57: 11.514472', '2011-08-02 15: 33: 38.479838 ') ВОЗВРАЩЕНИЕ "id" C: /Ruby192/lib/ruby/gems/1.9.1/gems/activerecord-3.0.7/lib/active_record/connect ion_adapters / abstract_adapter.rb: 207:в `rescue in log '

Что очень и очень странно, поскольку я фактически установил значение, которое явно не равно NULL.Как получилось ???

Мой код такой:

  m_sum = Float(rand_int(1,500))
  m_type = "Purchase"

  puts m_type

  m_user_info = UserInfo.order("RANDOM()").first
  m_usertype = m_user_info.usertype
  m_transactionid=gid
  m_commited=true
  m_user_id=rand_int(1,User.count)
  m_created_at=rand_time(1.week.ago,Time.now)
  m_updated_at=Time.now

  if m_type.nil?
    puts "What the f"
  end
  puts m_type

  AccountLog.create(
    :sum               => m_sum,
    :type              => m_type,
    :usertype          => m_usertype,
    :game              => m_game,
    :transactionid     => m_transactionid,
    :commited          => m_commited,
    :user_id           => m_user_id,
    :created_at        => m_created_at,
    :updated_at        => m_updated_at
  )

#part of schema.rb
create_table "accountlogs", :force => true do |t|
  t.decimal  "sum",               :precision => 15, :scale => 10, :null => false
  t.string   "type",              :limit => 30, :null => false
  t.string   "usertype",          :limit => 30, :null => false
  t.integer  "transactionid",     :limit => 8,  :null => false
  t.boolean  "commited",                        :null => false
  t.integer  "user_id",           :limit => 8,  :null => false
  t.datetime "created_at"
  t.datetime "updated_at"
end

#Model

class AccountLog < ActiveRecord::Base
  belongs_to :user
end

Ответы [ 2 ]

1 голос
/ 02 августа 2011

type представляется зарезервированным, хотя и устаревшим, ключевым словом в ruby.

Возможно, вы хотите переименовать свой атрибут в другое.

0 голосов
/ 02 августа 2011

Вы используете 'type' в качестве атрибута. Согласно ссылке ниже, «type» может быть зарезервированным словом в языке ruby ​​и может вызывать некоторые проблемы, например, ту, с которой вы столкнулись.

Список зарезервированных слов

Вы можете видеть, что «тип» находится внизу, в «других словах, которые вызвали проблемы».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...