Ruby on rails / postgre - ни один оператор не соответствует заданному имени и типу (ам) аргументов. ошибка

Я получаю эту ошибку в своем приложении Ruby on Rails,

HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.

Я читал об API переполнения стека и не могу найти ответ, который мне подходит. Итак, это конкретные части кода:

ActiveRecord::StatementInvalid in Store#show_item

Showing /media/store_test/app/views/store/show_item.html.erb where line #24 raised:

PG::UndefinedFunction: ERROR:  operator does not exist: character varying = integer
LINE 1: ...CT "show_item".* FROM "current_item" WHERE (user_id = 1)
                                                               ^

Моя логика, лежащая в основе этой ошибки, заключается в том, что у меня есть два пользователя, пользователи магазина и пользователи-сотрудники, они оба являются пользователями, но у пользователей-сотрудников есть «флаг», поэтому они могут видеть все товары в магазине. У пользователей магазина нет этого флага, поэтому на этой веб-странице должны отображаться элементы, которые они «занесли в список желаний», и когда я создаю таблицу для ее заполнения, я получаю указанную выше ошибку /

Этот код работает, когда я являюсь сотрудником, и заполняет мою таблицу по мере необходимости, но не работает, когда я являюсь пользователем магазина.

Вопрос: Как я могу исправить эту ошибку, не внося серьезных изменений в код?

Обновлено: СХЕМА

  create_table "current_item", force: :cascade do |t|
    t.string   "name",                default: "", null: false
    t.string   "description"
    t.integer  "cost"
    t.datetime "created_at",                       null: false
    t.datetime "updated_at",                       null: false
    t.string   "user_id"
  end

Можете ли вы вставить определение таблицы из schema.rb в таблицу current_item?

Marcin Kołodziej 26.10.2018 03:50

Я только что отредактировал описание

KuroGane 26.10.2018 04:00

Вы используете стандартные целочисленные идентификаторы? Ваш user_id - это строка, и PostgreSQL не может сравнивать строки с целыми числами. Вы, вероятно, определили свой столбец user_id с неправильным типом, он должен быть целым числом (если вы не используете uuids, что менее вероятно).

Marcin Kołodziej 26.10.2018 04:03

Привет, Марчин, спасибо за это. Итак, я отредактировал его на t.integer, а затем выполнил rake db: migrate, но все равно получаю ошибку. Я что-то сделал не так, поскольку мне кажется, что ваше объяснение попадает в точку.

KuroGane 26.10.2018 04:24

Это точно такая же ошибка, которую вы получаете? Если да, можете ли вы проверить в своем schema.rb, видите ли вы t.integer "user_id" для таблицы current_item?

Marcin Kołodziej 26.10.2018 04:41

Вам нужно повторить эту миграцию, простое редактирование миграции и выполнение db:migrate ничего не даст. Кроме того, вы можете использовать t.references :user вместо t.integer :user_id.

mu is too short 26.10.2018 05:05

Привет, Марчин и мю. Значит, это должно было быть t.integer, и теперь я только что обновил схему, используя миграцию, а не редактировал схему вручную (моя глупость!). Теперь все работает правильно, так что спасибо

KuroGane 26.10.2018 05:12
0
7
1 143
1

Ответы 1

Спасибо Marcin Kologziej:

Столбец user_id был определен с неправильным типом. Вместо строк это должно быть целое число в соответствии с ошибкой. Поэтому я создал новую миграцию, используя код:

change_column :current_item, :user_id, :integer, using: 'user_id_id::integer'

А затем выполняем:

rake db:migrate

И теперь все работает отлично.

Другие вопросы по теме