изменение типа идентификатора модели с целого на десятичное заставляет все записи пытаться быть 0.0 (rails 3.2.1) - PullRequest
0 голосов
/ 05 марта 2012

Я новичок в рельсах (я думаю, что у меня довольно хорошо разбираются основы), и я работаю над приложением с простой структурой родитель-потомок: Company => Client => Group => Order,Соответствующими таблицами БД для этого вопроса являются Group и Order (Group has_many Orders).

Прямо сейчас, когда я создаю новую группу, одним из текстовых полей в форме является «Количество заказа» (которое является атрибутом: size в модели группы), и в строке кода естьдействие Create для GroupsController, которое генерирует n пустых ордеров, принадлежащих к этой конкретной группе:

  if @group.save
    @group.size.times do
      Order.create(:group_id => @group.id)
    end

Это прекрасно работает, но я хочу, чтобы Order.id был десятичным числом, а нецелое число.Я попытался сгенерировать следующую миграцию:

class ChangeOrderIdToDecimal < ActiveRecord::Migration
  def up
    change_column :orders, :id, :decimal, :precision => 5, :scale => 4
  end

, которая сначала, казалось, делала то, что я хотел.Все существующие заказы изменились с 4, 5, 6 на 4.0, 5.0, 6.0.Однако в конечном итоге я хочу добавить некоторый код к действию Create в GroupsController следующим образом:

  if @group.save
    order_id_decimal = 0.001
    @group.size.times do
      order_id = "#{@group.id}.#{order_id_decimal}".to_f
      Order.create(:group_id => @group.id, :id => order_id)
      order_id_decimal += 0.001
    end

Идея состоит в том, что если идентификатор группы равен 75, то заказы в этой группе будутимеют идентификаторы 75.001, 75.002, 75.003 и т. д.

По какой-то причине, хотя я создаю новые группы, он пытается сохранить каждый идентификатор заказа как 0.0000 и выдает мне эту ошибку:

ActiveRecord::RecordNotUnique in GroupsController#create

Mysql2::Error: Duplicate entry '0.0000' for key 'PRIMARY': INSERT INTO `orders`
(`created_at`, `group_id`, `note`, `order_status`, `title`, `updated_at`, ) VALUES 
('2012-03-04 20:28:15', 20, NULL, NULL, NULL, '2012-03-04 20:28:15')

Я пытался вручную изменить идентификатор ордера с консоли rails, и он экономит без ошибок, но на самом деле на самом деле не сохраняет.Если я набираю Order.find (0.0), он вытягивает один только что измененный ордер и имеет 0.0 для ID.Я полностью сбит с толку этим, и я не смог найти никакой помощи от поиска в Google.У кого-нибудь есть идеи?

Ответы [ 2 ]

0 голосов
/ 05 марта 2012

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

Я бы отказался от этой идеи, чтовы хотите, чтобы идентификаторы были как-то коррелированы между таблицами;внешние ключи и таблицы соединений должны быть в состоянии выполнить конечную цель (связанных групп и заказов).Первичные ключи не предназначены для бизнес-логики и не должны использоваться для этого: не заботьтесь о содержимом полей идентификатора, и ваше приложение будет намного счастливее.

0 голосов
/ 05 марта 2012

Используйте ТОЛЬКО целочисленный тип для поля id, и у вас НИКОГДА не будет таких проблем.Если вы изменили тип для идентификатора, вы должны управлять им вручную

...