Warum nicht damit verbundenen Aufruf Arbeit schaffen?
-
21-08-2019 - |
Frage
Ich habe ein User-Modell bekommt, der viele Elemente hat. Eine Bewertung gehört zu einem Benutzer und ein Punkt.
In der DB habe ich gesetzt ratings.user_id nicht NULL sein.
, wenn ich einen Artikel erschaffe, würde Ich mag, dies zu tun:
def create
current_user.items.create(params[:item]).ratings.create(params[:rating]
redirect_to items_path
end
Allerdings stockt dies mit einem SQL-Fehler „user_id kann nicht Null sein“
so umschrieb ich die create-Methode als
def create
current_user.items.create(params[:item]).ratings.create(params[:rating].merge({:user_id => current_user}))
redirect_to items_path
end
, die funktioniert.
Allerdings hatte ich gedacht, dass die Verkettungs Methoden erstellen Sie den Receiver des aktuellen Benutzers hat das Rating des User_id bevölkert würde. Wer weiß, warum nicht?
TIA.
Lösung
Ich würde empfehlen Sie diese normalisieren, wenn möglich in der Datenbank. Vielleicht machen Sie das user_id Attribut aus der Praxis Tabelle herausgenommen und, wenn Sie es in Ihrem Modell benötigen sie durch bekommt eine Verknüpfung mit einem: durch Verfahren
class Rating
has_many :items
has_one :user, :through=>:items
Andere Tipps
Wenn Ihr erstellt und das Element gespeichert, dann eine Bewertung von diesem Artikel gemacht, es nicht den Benutzer zusammen mit dem Rating passieren würde, nicht wahr? Sie würden nur um es als @ rating.item.user beziehen, nicht wahr?
Wenn man darüber so denken, würden Sie nicht den Artikel über die current_user erstellt erwarten entlang der Rating die Benutzerinformationen zu übergeben.
Machen Sie mich fragen, ob Sie wirklich den Benutzer has_many Bewertungen Beziehung benötigen.
Da Artikel viele Bewertungen haben und dieser Verein nicht weiß, über die Benutzer-ID. Da die Assoziation Ketten Artikel eine Benutzer-ID haben würden, weil es zu einem Benutzer gehört. Und Bewertung würde eine Artikel-ID haben, weil sie zu einem Element gehört. Aber der Artikel zur Bewertung assocation weiß nichts über einen Benutzer, wenn Sie es sagen.