ActiveRecord больше не находит дублирующиеся идентификаторы в массиве и не сохраняет для отношения «есть и принадлежит многим», Rails 4.2.8 - PullRequest
0 голосов
/ 30 октября 2018

Этим вечером я обновился с рельсов 4.2.0 до рельсов 4.2.8. Единственной серьезной проблемой было выяснить, почему мой массив item_ids больше не может иметь дубликат при сохранении в моих отношениях items_payments HABTM.

Это прекрасно работает в 4.2.0 ... но теперь, например, если я назначу @payment.item_ids = [14,14] перед сохранением платежа, rails и activerecord выдают эту ошибку: Couldn't find all Items with 'id': (14, 14) [WHERE "items"."id" IN (14, 14)] (found 1 results, but was looking for 2)

Если массив идентификаторов не имеет дубликатов, то он просто отлично сохраняет. Мне нужно, чтобы один и тот же item_id появлялся более одного раза, в случае, если пользователь покупает более одного экземпляра элемента. Как мне сделать так, чтобы это снова было нормально? Я знаю, что это может быть связано с устаревшими поисковиками ... но как мне сделать это правильно в 4.2.8 и, в конечном итоге, получить 5.0?

Редактировать: вот код в моем контроллере, модели и схеме. Я ничего не менял при обновлении рельсов ... и при сохранении массива идентификаторов предметов, таких как [14,12,5], он будет работать просто отлично. Это просто не позволит мне сохранять с идентификатором дубликата, как [14,14]

Контроллер:

items_array = []
items.each do |item|
    quantity = params[:payment][:item_quantity]["#{item.id}"][:quantity]
    quantity = quantity.to_i
    quantity.times do
        items_array.push(item.id)
    end
end

@payment.item_ids = items_array

Схема:

create_table "items_payments", id: false, force: :cascade do |t|
  t.integer "item_id"
  t.integer "payment_id"
end

Оплата Модель:

has_and_belongs_to_many :items

Модель товара:

has_and_belongs_to_many :payments

Наконец, вывод моей консоли:

(0.2ms)  SELECT COUNT(*) FROM "items" WHERE "items"."id" IN (14, 14)
  CACHE (0.0ms)  SELECT COUNT(*) FROM "items" WHERE "items"."id" IN (14, 14)
Completed 404 Not Found in 133ms (ActiveRecord: 8.6ms)

ActiveRecord::RecordNotFound (Couldn't find all Items with 'id': (14, 14) [WHERE "items"."id" IN (14, 14)] (found 1 results, but was looking for 2)):
  app/controllers/payments_controller.rb:196:in `block in create'
  app/controllers/payments_controller.rb:172:in `create'

1 Ответ

0 голосов
/ 30 октября 2018

Я думаю, что это просто основная ошибка в ActiveRecord для Rails 4.2.8. Если вы постепенно обновляетесь до Rails 5, просто обновитесь до Rails 4.2.9, и эта проблема полностью исчезнет ...

...