Comment puis-je définir une valeur par défaut dans ActiveRecord ?
Je vois un message de Pratik qui décrit un morceau de code compliqué et laid : http://m.onkey.org/2007/7/24/how-to-set-default-values-in-your-model
class Item < ActiveRecord::Base
def initialize_with_defaults(attrs = nil, &block)
initialize_without_defaults(attrs) do
setter = lambda { |key, value| self.send("#{key.to_s}=", value) unless
!attrs.nil? && attrs.keys.map(&:to_s).include?(key.to_s) }
setter.call('scheduler_type', 'hotseat')
yield self if block_given?
end
end
alias_method_chain :initialize, :defaults
end
J'ai vu les exemples suivants en cherchant sur Internet :
def initialize
super
self.status = ACTIVE unless self.status
end
et
def after_initialize
return unless new_record?
self.status = ACTIVE
end
J'ai aussi vu des gens le mettre dans leur migration, mais je préférerais qu'il soit défini dans le code du modèle.
Existe-t-il un moyen canonique de définir la valeur par défaut des champs dans un modèle ActiveRecord ?
0 votes
On dirait que vous avez répondu à la question vous-même, dans deux variantes différentes :)
22 votes
Notez que l'idiome Ruby "standard" pour "self.status = ACTIVE unless self.status" est "self.status ||= ACTIVE".
1 votes
La réponse de Jeff Perrin est bien meilleure que celle qui est actuellement marquée comme acceptée. default_scope est une solution inacceptable pour définir des valeurs par défaut, car elle a l'ÉNORME EFFET SECONDAIRE de modifier également le comportement des requêtes.
0 votes
Voir aussi stackoverflow.com/questions/3975161/
2 votes
Compte tenu de tous les votes positifs à cette question, je dirais que Ruby a besoin d'une méthode setDefaultValue pour ActiveRecord.
0 votes
Meilleure réponse : stackoverflow.com/a/41292328/1536309