Rails - 为模型创建UID

时间:2010-11-18 22:16:47

标签: ruby-on-rails ruby-on-rails-3

我有一个模型PhotoAlbum。

我希望Rails在创建时可以神奇地为PhotoAlbum创建一个UID。最好是一个非常长的数字/字母数字UID,好像坏人有这个UID,他们可以做坏事。

建议:

  • 用于制作UID的内容
  • 在哪里分配UID,我可以在架构中将其作为默认值吗?或者在之前或之后的模型中创建?这样做的聪明方法是什么?

由于

3 个答案:

答案 0 :(得分:3)

Rails默认为您处理数据库ID。

你真的不应该默默无闻地使用安全性 - 你应该使用插件来处理身份验证和授权,然后即使他们知道ID,坏人也无法做任何事情。

答案 1 :(得分:2)

简单的十六进制密钥怎么样?只需将伪随机数据和模型数据组合起来并将其输入hexdigest即可获得一个相当独特的密钥,一个简单的检查可以确保它真的是唯一的。

class Album
  before_create :set_uid

  protected
    def set_uid
      # This only works before_create obviously, otherwise it would
      # find itself and loop eternally.
      while self.uid.blank? or !Album.find_by_uid(self.uid).blank?
        self.uid = Digest::SHA1.hexdigest("--#{self.title}--#{Time.current.usec}--")
      end
    end
end

你可以稍微清理一下,但它应该有用。

至于在架构中这样做,我猜这取决于你使用的数据库引擎,我不是那里的专家;)

答案 2 :(得分:0)

如何使用after_initialize钩子?

我正在假设您不希望UUID作为主键(否则事情会更复杂)。为了你的目的,我会避免这种情况。

不幸的是,我没有经过测试就完成了所有这些工作,所以我无法100%确定我没有做过任何拼写错误。如果您遇到任何问题,请随时给我发消息。

首先,您需要在项目中添加uuidtools。假设有rails 2,这是在config / environment.rb

Rails::Initializer.run do |config|
  ..
  # You can try a later uuidtools version, but this is the one I've worked with
  config.gem "uuidtools", :version => '2.1.1'
  ..
end

添加完上述内容后,请运行“sudo rake gems:install”,然后下载并安装gem。

然后,在您的模型中,添加以下代码:

  validates_length_of :uuid, :is => 36 # Untested.. makes sense to me though
  def after_initialize
    self.uuid ||= UUIDTools::UUID.random_create.to_s
  end

在您创建表格的迁移中:

create table :photo_albums do |t|
  ..
  t.string :id, :limit => 36
  ..
end

我希望有所帮助。

奥斯卡