我有以下模型:
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