Custom setters & getters vs ActiveRecord



我有以下模型:

class ActivityLog < ActiveRecord::Base
  validates :user_id, :instance_id, :action, presence: true
  validates :user_id, :instance_id, :action, numericality: true
  belongs_to :user
  def self.log(action, instance)
    ActivityLog.create(
      user_id: instance.user.id,
      instance_id: instance.id,
      action: action
      )
  end
  def action
    actions[:action]
  end
  def action=(action)
    write_attribute(:action, actions.index(action))
  end
  def actions
    ['start','stop','create','destroy']
  end
end

我试图在模块的接口层中替换def actions中定义的关键字,但在数据库中保存一个整数。

我有以下顾虑:

  • def actions我认为应该在类上定义,但我不确定如何从实例调用它。
  • 我如何让它写到数据库?
  • private应该是什么?

标准的方法是使用constant:

class ActivityLog < ActiveRecord::Base
  validates :user_id, :instance_id, :action, presence: true
  validates :user_id, :instance_id, :action, numericality: true
  belongs_to :user
  ACTIONS = ['start','stop','create','destroy']
  def self.log(action, instance)
    ActivityLog.create(
      user_id: instance.user.id,
      instance_id: instance.id,
      action: action
      )
  end
  def action
    ACTIONS[:action]
  end
  def action=(action)
    write_attribute(:action, ACTIONS.index(action))
  end
end

如果你运行的是rails 4.1,你可以使用enum:

class ActivityLog < ActiveRecord::Base
  validates :user_id, :instance_id, :action, presence: true
  validates :user_id, :instance_id, :action, numericality: true
  belongs_to :user
  enum action: ['start','stop','create','destroy']
  def self.log(action, instance)
    ActivityLog.create(
      user_id: instance.user.id,
      instance_id: instance.id,
      action: action
      )
  end     
end
ActivityLog.actions  #=> ['start','stop','create','destroy']
a = ActivityLog.new
a.status = 'start'
a.status             #=> 'start'
a.start?             #=> true      

最新更新