我希望能够做Artist.case_insensitive_find_or_create_by_name(artist_name)[1](并且它可以在sqlite和postgreSQL上工作)
实现这一目标的最佳方法是什么?现在我只是直接向Artist类添加一个方法(有点难看,特别是如果我想在另一个类中使用此功能,但无论如何):
def self.case_insensitive_find_or_create_by_name(name) first(:conditions => ['UPPER(name) = UPPER(?)',name]) || create(:name => name) end
[1]:理想情况下,它将是Artist.find_or_create_by_name(artist_name,:case_sensitive => false),但这似乎更难实现
解决方法
这个答案是针对问题评论中提出的其他问题.
如果覆盖该方法,则无法调用默认的find_or_create_by_name.但您可以实现自己的,如下所示:
def self.find_or_create_by_name(*args) options = args.extract_options! options[:name] = args[0] if args[0].is_a?(String) case_sensitive = options.delete(:case_sensitive) conditions = case_sensitive ? ['name = ?',options[:name]] : ['UPPER(name) = ?',options[:name].upcase] first(:conditions => conditions) || create(options) end
现在您可以调用重写方法,如下所示:
User.find_or_create_by_name("jack") User.find_or_create_by_name("jack",:case_sensitive => true) User.find_or_create_by_name("jack",:city=> "XXX",:zip => "1234") User.find_or_create_by_name("jack",:zip => "1234",:case_sensitive => true)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。