ruby-on-rails – 不区分大小写find_or_create_by_whatever

我希望能够做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)

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...