在ActiveRecord模型中设置默认随机列值

时间:2009-11-15 10:21:38

标签: ruby-on-rails activerecord

有2个型号:

class User < ActiveRecord::Base
  has_many :posts
end

class Post < ActiveRecord::Base
  belongs_to :user
end

Posts表有一列:u_hash。这应该是随机生成的标识哈希(供公众查看)。生成此哈希的最佳方法是什么?如何将其添加到表中?我们的想法是,所有这些都将在后台发生,并且对用户不可见(表单中没有隐藏字段)。使用的数据库是MySQL,如果这可以帮助我以某种方式。

提前致谢! Ĵ

2 个答案:

答案 0 :(得分:4)

before_validation_on_create模型最有可能需要Post回调。当您将新的ActiveRecord记录保存到数据库中时,此回调在内部由Post功能调用。

您可以找到一个好的回调参考和订单回调的提示here

以下是一段代码,解释了您需要使用before_validation_on_create的原因:

class Post < ActiveRecord::Base
  belongs_to :user
  validates_uniqueness_of :u_hash
  before_validation_on_create :generate_u_hash

  def generate_u_hash
    begin
      new_u_hash = "random hash here"
    end while Post.find_by_u_hash(new_u_hash)
    self.u_hash = new_u_hash
  end
end

答案 1 :(得分:0)

这听起来像是ActiveRecord callbacks的工作。

如果你的帖子表有一个before_create回调,你可以在每次创建新的帖子实例时自动创建和设置一个值。

e.g:

class Post < ActiveRecord::Base
  belongs_to :user

  before_create  :set_uhash_column

  private

  def set_uhash_column
    #your code here - something like self.uhash = ...
  end
end