Нет идентификаторов при создании нового объекта в Rails с PostgreSQL в качестве базы данных - PullRequest
2 голосов
/ 14 декабря 2010

Мои настройки следующие: я использую Rails 3.0.1 с базой данных PostgreSQL 9.0. Мои модели организованы в подмодули.

Когда я использую консоль для создания нового объекта любого типа (c = ::Physical::Base::Contact.new) и его сохранения, идентификатор объекта не заполняется автоматически. Он записывается в базу данных, но мой объект, который я только что созданный не принимает к сведению идентификатор, который генерируется последовательностью в PostgreSQL. Мой сценарий миграции для создания таблицы приведен ниже. Я пишу их сам и не использую стандартную функцию генерации рельсов, чтобы лучше контролировать свои таблицы.

Это стандартное поведение PostgreSQL + Rails, или я что-то упускаю, написав миграцию самостоятельно?

class Contact < ActiveRecord::Migration
  def self.up
    execute "
      create table contacts(
        id serial,
        contact_type_id integer not null check (contact_type_id > 0),
        value text not null check (length(value) > 0)
      )
    "
  end

  def self.down
    execute "
      drop table contacts;
    "
  end
end

1 Ответ

2 голосов
/ 15 декабря 2010

Убедитесь, что вы установили первичный ключ на своем столе, у меня недавно была такая же проблема, и это очень расстраивало.Я решил воссоздать таблицу с помощью миграций и заметил, что в моей старой таблице отсутствует первичный ключ.После того, как я его добавил, все заработало, как и ожидалось!

Вам понадобится что-то вроде «изменить контакты таблицы добавить первичный ключ (id)» - ActiveRecord, похоже, не понимает, если индекс первичного ключа отсутствуетэто поле.

До первичного ключа я получил бы:

ruby-1.9.2-p0 > Job.create
=> #<Job id: nil, data: nil, timestamp: nil, enqueued_at: nil, started_at: nil, completed_at: nil, status: nil, result: nil, job_queue_id: nil, job_handle: nil, uniq: nil, priority: nil, server_id: nil> 

Теперь, когда я добавил первичный ключ, результат будет:

ruby-1.9.2-p0 > Job.create
=> #<Job id: 17937, data: nil, timestamp: nil, enqueued_at: nil, started_at: nil, completed_at: nil, status: nil, result: nil, job_queue_id: nil, job_handle: nil, uniq: nil, priority: nil, server_id: nil> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...