has_many: durch Brüche auf find_or_initialize_by
-
05-07-2019 - |
Frage
Ich habe ein Modell, Futtermittel, die zu vielen GefilterteBenutzer und gehört hat. In diesem Fall habe ich es durch einen has_many umgesetzt. Durch Beziehung
class Feed < ActiveRecord::Base
has_many :denials, :dependent => :destroy
has_many :filtered_users, :through => :denials
würde Ich mag einen Datensatz erstellen, wenn es nicht oder das Objekt finden existiert, wenn es vorhanden ist. Wenn ich versuche, und die find_or_initialize_by (oder find_or_create_by) eine Ausnahme undefined method 'feed_id=' for <FilteredUser..
geworfen sagt
Hier ist der Code:
feed = Feed.find(params[:id])
user = feed.filtered_users.find_or_initialize_by_user_url(params[:user_url])
if params[:status] == "block"
feed.filtered_users << user
else
feed.filtered_users.delete(user)
end
feed.save
Alle Vorschläge, wie dies zu beheben oder, wie um ihn zu arbeiten trocken?
Danke!
Lösung
Erstens, weil es eine has_many :through
Beziehung ist, hat die Initialisierung keine Möglichkeit zu wissen, welche die neuen denial
filtered_user
sollte in Verbindung gebracht werden. Wenn Sie verwenden find_or_initialize_by
wollen, müssen Sie es auf einem bestimmten denial
auszuführen, die mit dem feed
verbunden ist.
Erstellen Sie eine neue filtered_user und verbinden sie mit einer bestimmten Ablehnung.
Zweitens, die Vereinbarung mit ErsatzRyan, die allgemeine Logik scheint ein wenig ab.
Andere Tipps
Wäre es nicht einfacher, die params zu überprüfen [: status]? Und dann tun, was Sie tun müssen,
feed = Feed.find(params[:id])
if params[:status] == 'block'
feed.filtered_users.build(:user_url => params[:user_url])
else
feed.filtered_users.find_by_user_url(params[:user_url]).delete
end
feed.save
Diese Warnung wird Luft codiert nicht getestet