So aktualisieren Sie ein Join-Modell mit einem has_many: durch Assoziation?
-
27-09-2019 - |
Frage
Ich habe eine Frage bezüglich many-to-many-Beziehungen, insbesondere has_many. Durch Verbände
Alle Tutorials fand ich einfach eingerichtet mit den Modellen und Migrationen aber lassen Sie hängen, wenn es um Controller kommt.
Was ich tun möchte, ist den Zeitstempel aktualisieren der Tabelle beitreten, wenn ein Artikel, der bereits vorhanden ist, wieder hinzugefügt wird, so dass es an die Spitze der „Liste“ bewegt. Wie kann ich das tun?
Dies ist, was Aktion erstellen mein Aussehen wie:
def create
@article = Article.find_or_create_by_url(params[:article])
if current_user.articles.find(@article)
# update the timestamps on the join table
# ie moved the old article to the top
flash[:notice] = "Successfully added article (again)."
redirect_to @article
else
@article.users << current_user
if @article.save
flash[:notice] = "Successfully added article."
redirect_to @article
else
render :action => 'new'
end
end
end
Vielen Dank im Voraus!
Update:
@ Ben Lee
Vielen Dank für Ihre Antwort, wie ich habe eine has_many durch Assoziation meinen Artikel Modell sieht wie folgt aus:
has_many :readinglist_items, :dependent => :destroy
has_many :users, :through => :readinglist_items
Also ich weiß nicht, ob ich einen :touch => true
zu has_many hinzufügen kann, wie ich mag nur bestimmten Eintrag in dem Join-Tabelle.
Der Punkt des Updates in der Aktion zu erstellen ist, den Artikel nach oben zu bewegen (anstatt es erneut hinzufügen), wenn ein Benutzer einen Artikel fügt es bereits in der Vergangenheit hinzugefügt hat.
Lösung 2
ich es gelöst! (Readinglist_item ist der Name der Join-Tabelle):
def create
@article = Article.find_or_create_by_url(params[:article])
if current_user.articles.find(@article)
@article.readinglist_items.find_by_user_id(current_user.id).touch
flash[:notice] = "Successfully added article (again)."
redirect_to @article
else
@article.users << current_user
if @article.save
flash[:notice] = "Successfully added article."
redirect_to @article
else
render :action => 'new'
end
end
end
Andere Tipps
Wenn ich Sie richtig verstehe, dann ist dies kein Controller Problem, sondern ein Modell Problem. Sie können :touch => true
auf einer belongs_to
Beziehung angeben. Dadurch wird es so, dass, wenn das Kind aktualisiert wird, wird der Verein update_at
aktualisiert gut.
So setzte so etwas wie dies in Ihrem Article
Modell:
belongs_to :whatever, :touch => true
Auch tangential bezogen werden: es ist nicht klar, aus dem Code genau das, was Ihr Code tut, aber es scheint, wie vielleicht haben Sie create
und update
Funktionalität setzen sowohl im create
Methode sie statt Aufspaltung in geeigneter Weise