新しい ActiveRecord レコードのデフォルト値を設定するためのスキームを開発することが実現可能かどうかについて興味があります。ここの回答のいくつかと、属性の設定に関するこの投稿に基づいて、次のようなものを思いつきました。
class Taco < ActiveRecord::Base
DEFAULT_ATTR = {spice_level: 4}
before_save do |taco|
if new_record?
DEFAULT_ATTR.each do |k,v|
taco[k] ||= v
end
end
end
end
パラノイアの場合、定数を使用して移行のデフォルトを設定することもできます。
class CreateTacos < ActiveRecord::Migration
def defaults
Taco::DEFAULT_ATTR
end
def change
add_column :tacos, :spice_level, :integer, :default => defaults[:spice_level]
end
end
(誰かが私が見落としていた明白な側面を指摘するまでは!) 役に立つのは、このスキームがコールバックとして ActiveRecord に組み込まれている場合、ala before_save (「new_record_defaults」のようなもの) です。メソッドをオーバーライドして、symbol => デフォルトのペアのハッシュを返すことができます。偏執的な移行コードでさえ、これを利用できるかもしれません。
私はまだ Rails にかなり慣れていないので、スキームが既に存在することや、なぜこれがばかげた考えなのかを言われる準備はできていますが、フィードバックは大歓迎です。:)
更新: Anton Grigoriev の回答によると、attribute-defaults gem が適していると思います。後世のために、作成されたデフォルトにアクセスするための、作成者のオリジナルに基づく追加の懸念事項を次に示します。
module ActiveRecord
module AttributesWithDefaultsAccessor
extend ActiveSupport::Concern
def all_defaults
defaults = {}
self.private_methods.each do |method|
if method =~ /^__eval_attr_default_for_(.+)$/
defaults[$1.to_sym] = self.send(method)
end
end
defaults
end
end
class Base
include AttributesWithDefaultsAccessor
end
end