如果您尝试以元编程方式创建类方法,这将非常有用:
def self.create_methods(method_name)
# To create instance methods:
define_method method_name do
...
end
# To create class methods that refer to the args on create_methods:
???
end
Run Code Online (Sandbox Code Playgroud)
我的回答是......
ActiveRecord validates_uniqueness_of很容易受到竞争条件的影响.要真正确保唯一性,需要额外的保护措施.ActiveRecord RDocs的一个建议是在数据库上创建一个唯一索引,例如通过包含在您的迁移中:
add_index :recipes, :name, :unique => true
Run Code Online (Sandbox Code Playgroud)
这将确保在数据库级别名称是唯一的.但这种方法的一个缺点是,ActiveRecord::StatementInvalid尝试保存副本时返回的异常不是很有用.在捕获此异常时,无法确定错误是由重复记录生成的,而不仅仅是由损坏的SQL生成的.
正如RDocs所建议的那样,一种解决方案是解析异常附带的消息,并尝试检测诸如"重复"或"唯一"之类的字,但这很麻烦,而且消息是特定于数据库后端的.对于SqlLite3,我的理解是该消息是完全通用的,并且不能以这种方式解析.
鉴于这是ActiveRecord用户的一个基本问题,很高兴知道是否有任何标准方法来处理这些异常.我将在下面提出我的建议; 请评论或提供替代方案; 谢谢!