要成为DRY,我可以在ActiveRecord中访问字符串列宽限制吗?

时间:2012-06-12 20:22:03

标签: ruby-on-rails-3 activerecord

在编写Rails应用程序时,有几个地方需要字符串表列宽:验证,RSpec测试,输入表单等。似乎也值得在DB中设置字符串的长度限制。

目前我已经在模型中设置了LENGTHS哈希,因此我可以在其他地方访问长度并在这方面保持代码DRY。如果我在DB中设置长度限制,是否可以从那里读取值(或用它们初始化LENGTHS哈希)以使代码更干?也就是说,什么是读取模型中数据库列的字符串长度限制的代码,以便我可以使用它?

2 个答案:

答案 0 :(得分:1)

您可以访问AR模型的columns方法。

Model.columns.map(&:limit)
Model.columns.map(&:name)
Model.columns.map(&:null)
Model.columns.map(&:sql_type)
...

所以你可以使用这个方法来构造你的哈希/数组/其他。 我相信你所说的长度属性是限制这个表示法。

答案 1 :(得分:0)

class ActiveRecord::Base
  def self.method_missing(method_id, *args)
    if self.columns_hash.has_key?(method_id.to_s)
      self.columns_hash[method_id.to_s]
    else
      super
    end
  end
end

这允许以干净的方式访问columns_hash提供的任何列架构数据。因此:

Model.column_name返回所有可用数据的哈希值

Model.column_name.hash_key会返回一个感兴趣的值

例如: Company.contact_name.limit返回contact_name列的最大长度。 根据我的阅读,数据库在启动时加载架构数据,因此不会发生数据库命中,columns_hash会记住数据。