1

私は次のようなモデルを持っています

class CqmExternalId < ActiveRecord::Base
        set_table_name :cqm_external_id
        has_many :ipp_measure_ids, :class_name => "CqmMeasureId", :foreign_key => "cqm_external_id", :conditions => [" name = 'IPP'"]
        has_many :numer_measure_ids, :class_name => "CqmMeasureId", :foreign_key => "cqm_external_id", :conditions => [" name = 'NUMER'"]
        has_many :denom_measure_ids, :class_name => "CqmMeasureId", :foreign_key => "cqm_external_id", :conditions => [" name = 'DENOM'"]
        has_many :denex_measure_ids, :class_name => "CqmMeasureId", :foreign_key => "cqm_external_id", :conditions => [" name = 'DENEX'"]
end

class CqmMeasureId < ActiveRecord::Base
        set_table_name :cqm_measure_id
        belongs_to :cqm_external, :class_name => "cqm_external", :foreign_key => "cqm_external_id"
end

ipp_measure_idsデフォルト値を挿入するための関連付けの作成方法create

 c = CqmExternalId.first
 c.ipp_measure_ids.create!(:key=>"ABC-1234")  => #<CqmMeasureId id: 1, name:nil, key:"ABC-1234>"

 # I want the name attribute to be initialized automatically as "IPP"
4

3 に答える 3

1

常にアプリケーション全体が必要な場合は、移行を追加して、列にデフォルト値を設定します。

change_column :ipp_measure_ids, :name, :string, :default => 'IPP'

このアプローチでは、ant を記述する必要はありません。名前列は「IPP」として保存されます。

将来的に値を変更する可能性がある場合は、次のようなモデルで before save メソッドを使用することをお勧めします。

 before_save :save_default_name_value

   def save_default_name_value
     self.name = 'IPP' if self.name.blank?
   end

ただし、保存(作成、更新)するたびに、この関数が呼び出されることを確認してください。作成時のみ必要な場合は、after_createメソッドを選択してください。

詳細なドキュメントについては、 http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.htmlも確認してください。両方のアプローチを見て、どちらが適しているかを適用してください。

于 2013-10-04T06:46:03.637 に答える
-1

すべてのリレーションは同じクラスを持っているため、CqmExternalIdクラスでこのタスクを実行するためのラッパー メソッドを作成する必要があります。何かのようなもの:

def create_ipp_measure_id(attrs)
  data = attrs.merge({:name => "IPP"})
  ipp_measure_ids.create!(data)
end

そしてcreate!、リレーションの代わりにメソッドを使用します。

于 2013-10-04T06:17:22.447 に答える