0

新しい 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
4

2 に答える 2

0

このロジックをデータベース レベルではなくアプリケーション レベルで保持することをお勧めします (移行による)。

アプリケーション レベルでは、これは単なる属性の上書きです。

class Taco < ActiveRecord::Base
  def spice_level
    read_attribute(:spice_level) || 4
  end
end

基本は、この属性を 5 などに設定した場合は 5、そうでない場合は 4 です。

属性の上書きに関する参照: http://api.rubyonrails.org/classes/ActiveRecord/Base.html#label-Overwriting+default+accessors

于 2013-04-30T17:06:26.837 に答える