【问题标题】:Set default random column value in ActiveRecord model在 ActiveRecord 模型中设置默认随机列值
【发布时间】:2009-11-15 18:51:14
【问题描述】:

有 2 个模型:

class User < ActiveRecord::Base
  has_many :posts
end

和

class Post < ActiveRecord::Base
  belongs_to :user
end

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

提前致谢! J

【问题讨论】:

    标签: ruby-on-rails activerecord


    【解决方案1】:

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

    一个很好的回调参考和调用顺序回调的提示你可以找到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
    

    【讨论】:

    • 只是为了帮助其他有同样问题的人:new_u_hash = Digest::SHA256.hexdigest("-#{Time.now.to_s}--#{self.title}--")[ 0,15] 标题由用户输入:)
    【解决方案2】:

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

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

    例如:

    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
    

    【讨论】:

      猜你喜欢
      • 2016-02-12
      • 2010-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-27
      • 1970-01-01
      相关资源
      最近更新 更多