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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top