0

関連する日付フィールドがいくつかあるモデルがあります。

def started_at_date=(value)
  @started_at_date = value
end

def completed_at_date=(value)
  @completed_at_date = value
end

...

ゲッターは経由method_missingで処理され、それはうまく機能します。

def method_missing(method, *args, &block)
  if method =~ /^local_(.+)$/
    local_time_for_event($1)
  elsif method =~ /^((.+)_at)_date$/
    self.send :date, $1
  elsif method =~ /^((.+)_at)_time$/
    self.send :time, $1
  else
    super
  end
end

def date(type)
  return self.instance_variable_get("@#{type.to_s}_date") if self.instance_variable_get("@#{type.to_s}_date")
  if self.send type.to_sym
    self.send(type.to_sym).in_time_zone(eventable.time_zone).to_date.to_s
  end
end

...

セッターを動的に追加したいのですが、ActiveRecord::UnknownAttributeErrorsを回避する方法がわかりません。

4

3 に答える 3

2

私はこれがうまくいくと思います:

def method_missing(method, *args, &block)
  super unless method =~ /_date$/
  class_eval { attr_accessor method }
  super
end
于 2012-05-26T15:06:24.317 に答える
1

仮想属性だけを使用できますか?

Class Whatever < ApplicationModel

  attr_accessor :started_at_date
  attr_accessor :completed_at_date

  #if you want to include these attributes in mass-assignment
  attr_accessible :started_at_date
  attr_accessible :completed_at_date


end

@started_at_date を呼び出す代わりに、後で属性にアクセスする必要がある場合は、self.started_at_date などを呼び出します。

于 2012-05-26T14:44:09.490 に答える
1

私があなたを正しく理解している場合は、次のことを試してください。

  # in SomeModel
  def self.new_setter(setter_name, &block)
      define_method("#{setter_name}=", &block)
      attr_accessible setter_name
  end

使用法:

 SomeModel.new_setter(:blah) {|val| self.id = val }

 SomeModel.new(blah: 5) # => SomeModel's instance with id=5
 # or
 @sm = SomeModel.new
 @sm.blah = 5
于 2012-05-26T15:14:22.963 に答える