Devrais-je utiliser la méthode de la classe de l'instance ou de la méthode, et pourquoi?
Dans mon application Rails, lors de la création d'une entreprise, j'ai un formulaire qui contient les champs suivants:
<%= check_box_tag(:default_company) %>
<%= label_tag(:default_company, "Set Company as Default") %>
Essentiellement lorsque je crée une entreprise, si elles cochez cette case, j'en ai besoin pour exécuter quelque chose comme le code suivant:
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
Lors de l'apprentissage, j'avais l'habitude de faire ce genre de choses dans mon contrôleur, mais je vais essayer de suivre les meilleures pratiques et l'utilisation d'un modèle de graisse, skinny contrôleur, donc je suis désireux d'utiliser la logique comme ceci:
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
Est ici où je suis confus quant à l'utilisation d'une méthode de classe ou une méthode d'instance, d'appel set_default_company
. Ils semblent tous deux comme s'ils fonctionnaient et je ne peux pas voir un avantage à l'un ou l'autre.
En plus de me donner toute information quant à la méthode à utiliser, si quelqu'un pouvait me montrer un bref de mise en œuvre de l'écriture que comme une méthode de classe, contre la méthode d'instance, il peut me donner une meilleure compréhension de pourquoi.
Voici comment j'allais écrire:
def self.set_default_company(company, user)
# Logic here
end
def set_default_company(company, user)
# Logic here
end
Écrit de cette façon je ne vois pas l'avantage à.
OriginalL'auteur ruevaughn | 2012-07-25
Vous devez vous connecter pour publier un commentaire.
Comme leur nom l'indique, les méthodes d'instance sur un modèle devrait être utilisé pour la logique/opérations qui se rapportent à une instance spécifique d'un utilisateur (celui sur lequel la méthode est appelée.) Alors que vous pourriez penser de réglage de la société par défaut pour un utilisateur comme une méthode d'instance sur
User
. Les méthodes de la classe sont des choses qui ne fonctionnent pas sur une instance individuelle d'un modèle ou pour les cas où vous n'avez pas l'instance disponibles pour vous. par exemple, vous pourriez avoir une méthode de classe pour ranger votre base de données commeUser.purge_expired_users
qui ne s'appliquerait pas à un utilisateur individuel de l'objet.par exemple
alors votre méthode de contrôleur:
Sinon, vous pourriez penser à la relation à partir d'un autre point de vue et de mettre une méthode d'instance sur
Company
par exemplecompany.set_as_default_for(user)
.OriginalL'auteur mikej
Je voudrais réellement faire
set_default_company
une méthode d'instance surUser
. UnUser
a un défautCompany
; pourquoi unCompany
besoin de ce que les utilisateurs, il est par défaut?OriginalL'auteur icecream
À mon avis, je crée toujours un
class method
si la méthode en question représente l'information/comportement qui est tout à fait générique, parmi tous les objets instanciés, différente de lainstance methods
, que j'utilise quand je crois que c'est plus comme une action spécifique de l'objet instancié en question.Mais c'est mon point de vue.
OriginalL'auteur MurifoX
Un peu les choses: vous avez une table séparée pour DefaultCompany? Cela semble comme il devrait être un indicateur booléen sur la table de la société.
Prochaine, est-il une association entre les entreprises et les utilisateurs? Si oui, il semble que la meilleure façon de le faire serait
Dans le modèle de l'utilisateur
Ou dans le modèle de l'Entreprise
Considérons le cas où une entreprise a 5 utilisateurs, si j'ai mis de la société champ booléen à vrai ce serait, pour tous les utilisateurs, correct?
J'ai oublié de mentionner que c'était un entreprises ont de nombreux utilisateurs à travers les rôles et les utilisateurs ont de nombreuses entreprises à travers les rôles ainsi
si chaque utilisateur peut avoir qu'une seule société par défaut, la valeur par défaut doit être une valeur booléenne sur les rôles de la table
Hmmm oui c'est donner un sens, un utilisateur pourrait, en théorie, avoir un rôle de "Propriétaire" et "Manager", il me semble que j'aurais du suivre les deux? Ou je suppose que je voudrais juste vérifier pour tous les rôles où un utilisateur appartient à la société x et de l'ensemble de tous ces rôles à la vraie, qui semble le mieux pour vous alors de rejoindre la table?
OriginalL'auteur Solomon