Sollte ich die Klasse, Methode oder Instanzmethode, und warum?
In meiner Rails-app, bei der Erstellung eines business ich habe ein Formular das folgende Feld:
<%= check_box_tag(:default_company) %>
<%= label_tag(:default_company, "Set Company as Default") %>
Im wesentlichen, wenn ich ein Geschäft, wenn Sie dieses Kontrollkästchen aktivieren, ich muss es ausführen so etwas wie den folgenden code:
def set_default_company(company, user)
exists = DefaultCompany.find(user.id)
if exists
exists.update_attributes(company: company)
else
DefaultCompany.create(company: company, user: user)
end
end
Beim lernen, möchte ich in der Regel tun, dass die Sachen in meinem controller, aber ich versuche zu Folgen, best practices und verwenden Sie einen fat model, skinny controller, also bin ich, die Logik wie diese:
def create
@company = Company.new(params[:company])
if @company.save
if params[:default_company]
Company.set_default_company(@company.id, current_user.id,)
end
flash[:notice] = "Company was successfully created."
redirect_to @company
else
redirect_to new_company_path
end
end
Hier bin ich immer verwirrt auf, ob die Methode einer Klasse oder eine Instanz-Methode, um den Anruf set_default_company
. Sie beide scheinen, wie Sie funktionieren würde, und ich kann nicht einen Vorteil sehen, um den ein oder anderen.
Zusätzlich zu geben mir keine Informationen darüber, welche Methode zu verwenden, wenn jemand mir zeigen könnte eine kurze Implementierung zu schreiben als Methode einer Klasse vs. Instanz-Methode kann es geben, mich besser zu verstehen, warum.
Hier ist, wie würde ich es schreiben:
def self.set_default_company(company, user)
# Logic here
end
def set_default_company(company, user)
# Logic here
end
Schreiben Sie auf diese Weise sehe ich keinen nutzen für.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als Ihr name vermuten lässt, Instanz-Methoden auf ein Modell sollte verwendet werden, für die Logik/Operationen, die sich auf eine bestimmte Instanz ein Benutzer (der auf dem die Methode aufgerufen wird.) So könnte man denken, dass die Einstellung der Standard-Firma, die für einen Benutzer als eine Instanz-Methode auf
User
. Klasse Methoden sind für Dinge, die nicht funktionieren mit einer einzelnen Instanz eines Modells oder für die Fälle, in denen Sie nicht über die Instanz zur Verfügung. beispielsweise könnten Sie eine Klasse Methode, um aufzuräumen Ihre Datenbank wieUser.purge_expired_users
würde nicht für einen einzelnen Benutzer-Objekt.z.B.
dann Ihre controller-Methode würde wie folgt Aussehen:
Alternativ könnte man denken, dass die Beziehung aus der anderen Perspektive-und eine Instanz-Methode auf
Company
z.B.company.set_as_default_for(user)
.Ich würde tatsächlich
set_default_company
eine Instanz-Methode aufUser
. EinUser
hat eine Standard -Company
; warum sollte einCompany
müssen, was die Nutzer ist es Standard für?Meiner Meinung nach, ich erstelle immer ein
class method
wenn die Methode in Frage stellt Informationen/Verhalten, das ist ziemlich generisch, unter allen die instanziierten Objekte, die sich von derinstance methods
, dass ich verwenden, wenn ich glaube, es ist mehr wie eine bestimmte Aktion des instanziierten Objekts in Frage.Aber das ist meine Sicht.
Ein paar Dinge: haben Sie eine separate Tabelle für DefaultCompany? Dies scheint, wie es sollte ein boolean-flag auf der Tabelle Unternehmen.
Nächste, ist es, eine Verbindung zwischen Unternehmen und Nutzer? Wenn dem so ist, scheint es der beste Weg, es zu tun wäre
In der Benutzer-Modell
Oder in der Firma Modell
primary_role.company