4

Я использую rails_admin для панели администратора. Просто изменить ассоциации в модели ImageActiveRecord :: StatementInvalid PG :: UndefinedColumn: ERROR

От этого

class Image < ApplicationRecord 
    belongs_to :user 
    belongs_to :product 
end 

к этому

class Image < ApplicationRecord 
    has_one :user 
    has_one :product 
end 

и пользователя модели

class User < ApplicationRecord 
    has_many :images,dependent: :destroy 
end 

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

ActiveRecord::StatementInvalid at /user/72/edit 

PG::UndefinedColumn: ERROR: column users.image_id does not exist 
LINE 1: SELECT "users".* FROM "users" WHERE "users"."image_id" = $1... 
             ^
: SELECT "users".* FROM "users" WHERE "users"."image_id" = $1 LIMIT $2 

ответ

1

Rails имеет отличную документацию. В документации для has_onefound here указано, что «этот метод должен использоваться только в том случае, если другой класс содержит внешний ключ», поэтому он ищет внешний ключ image_id в записи user. Вы создали бы это путем миграции; см. этот stack overflow post для получения дополнительной информации о внешних ключах и миграциях.

Но прежде чем идти так далеко, пожалуйста, рассмотреть следующие вопросы:

  • Почему бы вы изменили отношение изображения от belongs_to :user к has_one :user в первую очередь? Чтобы объединить ассоциации SQL и как Rails сопоставляет их, если пользователь has_many :images, тогда изображения обязательно должны быть belong_to пользователь; они являются противоположными сторонами отношения, а исключение является отношением has_and_belongs_to_many. Если A принадлежит B, то B имеет один (или много) из A. Я бы настоятельно рекомендовал вам поддерживать изображения как имеющие отношения belongs_to, в то время как Пользователь и Продукт могут have_many изображений. Чтобы объяснить, почему это имеет смысл: у пользователя могут быть фотографии профиля их лица, их дома и т. Д. (has_many :images). Продукт (обувь) может иметь несколько фотографий одного и того же ботинка (has_many :images), но очень маловероятно, что конкретная фотография обуви будет отображаться как для пользователя, так и для продукта.
  • Я настоятельно рекомендую вам управлять изображениями и вложениями с помощью драгоценного камня, например attachinary или paperclip. Если вы работаете с загруженными файловыми вложениями, библиотеки, подобные этому, сэкономит вам головные боли по дороге, когда дело доходит до изменения размера, сжатия изображения и т. Д. Я уверен, что ваше направление в попытке изменить отношение было сообщено некоторыми проблемами, которые эти драгоценные камни решат для вас.
+0

Я понимаю ваше объяснение, но я использую единую таблицу изображений для пользователя и продукта. Пользовательский образ сохраняется во время new_user и edit_user и так же, как и для продукта. пользователь может иметь максимум 3 изображения. пользователь и продукт не имеют прямого отношения, это похоже на этот продукт user-> store->. Но когда я использую own_to для пользователя и продукта, их идентификаторы требуются в таблице изображений, которая мне не нужна. если пользователь сохраняет изображение, чем в таблице изображений product_id имеет значение null и наоборот, и это не происходит в случае belongs_to. –

+0

Это имеет смысл, и одна таблица изображений - хороший дизайн; в этом случае вам может потребоваться иметь таблицу пересечений столбцов «entity, entity_id, image_id». Entity будет именем класса и идентификатором, поэтому строка будет выглядеть как «User, 1, 2», где 1 является user_id и 2 - image_id. Я снова призываю вас использовать что-то вроде Attachinary, которое обрабатывает всю эту настройку для вас. – quetzaluz

+0

Еще одно примечание: «has_many» также нуждается в декларации «через:». Подробнее об этом здесь: http://guides.rubyonrails.org/association_basics.html # the-has-many-through-association – quetzaluz

Смежные вопросы