У меня есть приложение Rails с двумя моделями, к которым присоединяется третья:
class Food < ApplicationRecord
has_many :shopping_list_items
has_many :users, through: :shopping_list_items
end
class ShoppingListItem < ApplicationRecord
belongs_to :user
belongs_to :food
end
class User < ApplicationRecord
has_many :shopping_list_items
has_many :foods, through: :shopping_list_items
end
Средняя модель, ShoppingListItem
, имеет несколько дополнительных атрибутов, включая priority
, которые я хотел бы обновите напрямую.
Так, например, я хотел бы сделать что-то вроде:
r = current_user.shopping_list_items.where(food_id: 1).first
r.priority = "urgent"
r.save
Объект выглядит нормально, пока я не пытаюсь его сохранить, , когда я получаю SQL ошибка:
ActiveRecord::StatementInvalid (PG::SyntaxError: ERROR: zero-length delimited identifier at or near """"
LINE 1: ...$1, "updated_at" = $2 WHERE "shopping_list_items"."" IS NULL
^
: UPDATE "shopping_list_items" SET "priority" = $1, "updated_at" = $2 WHERE "shopping_list_items"."" IS NULL):
Я полагаю, это жалуется на отсутствие первичного ключа? Не уверен, как это исправить, так как в документации по rails говорится, что у соединяемых таблиц не должно быть столбца первичного ключа ...
Я создал среднюю таблицу с миграцией, подобной этой:
create_table :shopping_list_items, id: false do |t|
t.belongs_to :user
t.belongs_to :food
t.string :priority
t.integer :position
t.timestamps
end