4

Ich verwende Rails_admin für Admin-Panel. Gerade Assoziationsmodell in Bild ActiveRecord :: StatementInvalid PG :: UndefinedColumn: Fehler

Von diesem

class Image < ApplicationRecord 
    belongs_to :user 
    belongs_to :product 
end 

dieser

class Image < ApplicationRecord 
    has_one :user 
    has_one :product 
end 

und User-Modell

ändern ist

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

immer diese Fehlermeldung, wenn ich versuche Benutzer Admin zu bearbeiten panel.Von der anderen Seite funktioniert es gut.

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 

Antwort

1

Schienen hat eine großartige Dokumentation. Die Dokumentation für has_onefound here besagt, dass "Diese Methode sollte nur verwendet werden, wenn die andere Klasse den Fremdschlüssel enthält" also sucht es nach dem Fremdschlüssel von image_id auf dem user Datensatz. Sie würden dies durch eine Migration erstellen; Weitere Informationen zu Fremdschlüsseln und Migrationen finden Sie unter stack overflow post.

Aber bevor Sie so weit gehen, beachten Sie bitte:

  • Warum würden Sie das Bild Beziehung belongs_to :user-has_one :user im erster Linie ändern? Um die SQL-Assoziationen zu reduzieren und wie Rails ihnen zugeordnet ist, müssen Benutzer has_many :images Bilder dann unbedingt belong_to Benutzer; sie sind gegenüberliegende Seiten der Beziehung, wobei eine Ausnahme eine has_and_belongs_to_many Beziehung ist. Wenn A zu B gehört, dann hat B eins (oder viele) von A. Ich würde Sie dazu ermutigen, die Bilder so zu halten, dass sie belongs_to Beziehungen haben, während Benutzer und Produkt have_many Bilder haben können. Erklären Sie anekdotisch, warum dies sinnvoll ist: Ein Benutzer könnte Profilbilder von seinem Gesicht, seinem Haus usw. haben (has_many :images). Ein Produkt (Schuhe) kann mehrere Bilder desselben Schuhs haben (has_many :images), aber es ist sehr unwahrscheinlich, dass ein bestimmtes Bild eines Schuhs sowohl einem Benutzer als auch einem Produkt zugeordnet wird.
  • Ich würde Ihnen dringend empfehlen, Bilder und Anhänge mit einem Juwel wie attachinary oder paperclip zu verwalten. Wenn Sie mit hochgeladenen Dateianhängen umgehen, werden Ihnen Bibliotheken wie diese bei der Größenanpassung, der Bildkomprimierung usw. Kopfschmerzen ersparen. Ich bin mir sicher, dass Ihre Richtung beim Versuch, die Beziehung zu ändern, durch einige der Probleme beeinflusst wurde Edelsteine ​​werden für Sie lösen.
+0

Ich verstehe Ihre Erklärung, aber ich verwende eine einzige Bildtabelle für Benutzer und Produkt. Das Benutzerbild wird zum Zeitpunkt new_user und edit_user sowie für das Produkt gespeichert. Benutzer kann maximal 3 Bilder haben. Benutzer und Produkt haben keine direkte Beziehung, es ist wie dieser Benutzer-> Shop-> Produkte. Aber wenn ich gehört, gehört für beide Benutzer und Produkt ihre Ids in Image-Tabelle, die ich nicht will. Wenn ein Benutzer ein Bild als in der Image-Tabelle speichert, ist product_id gleich null und umgekehrt, und dies geschieht nicht im Fall von "belongs_to". –

+0

Das macht Sinn und eine Bildtabelle ist gutes Design; In diesem Fall benötigen Sie möglicherweise eine Schnittstellentabelle mit den Spalten "entity, entity_id, image_id". Entity wäre der Klassenname und die ID. Eine Zeile wäre also etwa "User, 1, 2", wobei 1 die user_id und ist 2 ist die Bild_ID. Ich ermutige Sie erneut, etwas wie Attachinary zu verwenden, das all diese Einstellungen für Sie übernimmt. – quetzaluz

+0

Noch ein Hinweis darauf, dass das "has_many" auch eine "through:" Deklaration benötigt. Mehr Informationen dazu hier: http://guides.rubyonrails.org/association_basics.html # the-has-many-through-association – quetzaluz

Verwandte Themen