0

我有一个Order模型。

它应该有一个随机生成的key字段(我需要将它保存到数据库中)。

一旦创建,密钥应该是只读的。

我该怎么做?

PS: 我在 中创建了@key 实例变量after_initialize,但它不想存储在数据库中。我究竟做错了什么?

4

3 回答 3

1

确保您的key字段是 attr_reader 并且您有一个将关键字段添加到模型数据库表的迁移。

于 2013-06-13T13:58:14.477 回答
0

您应该使用before_create回调来生成密钥。然后覆盖key=访问器以防止覆盖此密钥:

def key= value
  raise "not allowed, you fool!"
end
于 2013-06-13T14:36:46.880 回答
0

你可以使用回调和ActiveRecord::Dirty来做你想做的事。

在您的数据库中创建一个列,例如将是一个字符串的键。

然后在你的模型中添加这个。

before_save :set_key_if_needed

def set_key_if_needed
  if self.persisted?
    self.errors.add(:key, 'key cannot be changed') if self.key.changed?
  else
    self.key = "Your key randomly generated"
  end
end

如果持久化?(如果对象已保存到数据库中)您检查密钥是否已更改,如果是,则阻止验证成功。否则,您只需生成您的密钥。

于 2013-06-13T14:27:27.163 回答