当前位置: 首页 > 面试题库 >

Rails虚拟属性搜索或sql组合列搜索

华乐逸
2023-03-14
问题内容

我有一个具有’first’和’last’属性的用户模型,因此,例如User.first.first#=>“ Charlie”
User.first.last#=>“ Brown”

该用户模型还具有虚拟属性“ full_name”

#user.rb
def full_name
  [first,last].join(' ')
end

def full_name=(name) #don't know what to do with people w/ middle names
  split = name.split(' ')
  self.first = split[0]
  self.last = split[1]
end

因此,例如:

User.first.full_name = "Charlie Brown" #=> "Charlie Brown"
User.first.full_name = "Homer Simpson" #=> "Home Simpson"
User.first.save
User.first.first #=> "Homer"
User.first.last #=> "Simpson"

如果我可以通过该虚拟属性进行搜索,那就太好了,例如进行动态查找:

User.find_by_full_name('Home Simpson') # this doesn't work

查找条件的示例:

User.all(:conditions => ['full_name LIKE ?', query]) #this doesn't work

我希望至少找到一些SQL语言的方法可以做到这一点。如果还找到动态的虚拟属性,那是果馅卷上额外的香草来源。(这个冬天有人吗?)

我还担心要搜索的名称,例如,“ Holmes”只能在“第一”列中搜索,而不能在“最后”列中搜索,例如User.first.full_name #=> "Sherlock Holmes"

我确实尝试进行更全面的搜索:

def self.find_by_full_name(name) #returns an array of User model
  return all if name.blank?

  split = name.split(' ', 2)
  output = []
  if split.length > 1
    with_scope( :find => { :conditions => ['first LIKE ?', "%#{split[0]}%"] }) do
      output << all(:conditions => ['last LIKE ?', "%#{split[1]}%"])
      output.flatten!
    end
  elsif split.length == 1
    output << all(:conditions => ['first LIKE ?', "%#{split[0]}%"])
    output << all(:conditions => ['last LIKE ?', "%#{split[0]}%"])
    output.flatten!
  end
end

例如

User.find_by_full_name("John").map(&:full_name) #=> ["John Resig", "John Doe"]
User.find_by_full_name("Doe").map(&:full_name) #=> ["John Doe", "Philips Doeringer"]
User.find_by_full_name("John Doe").map(&:full_name) #=> ["John Doe"]

但是我只是认为这里的find_by_full_name方法有点笨拙。

我的意思是,如果我有一个full_name列,则每次通过一次保存后过滤器(带有first和last的连接)进行设置。因此,找到一个人的名字,特别是对这个人的记忆模糊,会很有帮助。因此,如果我记得该人的名字或姓氏中的“
Doe”,那么我总是可以做一个简单的User.find_by_full_name(’Doe’)以尽可能多地返回以进一步固定它。

而且由于它是一列,因此如果需要执行类似Project.find(:all,:include => :users, :conditions=>['users.full_name LIKE ?', query]) where的操作,则可以在find(:conditions
[…])子句中搜索它。

#project.rb
has_many :assignments
has_many :users, :through=>:assignments

#user.rb
has_many :assignments
has_many :projects, :through => :assignments

#assignment.rb
belongs_to :user
belongs_to :project

节日快乐N


问题答案:

您可以在user.rb中使用named_scope:

named_scope :find_by_full_name, lambda {|full_name| 
  {:conditions => {:first => full_name.split(' ').first, 
     :last => full_name.split(' ').last}}
}

那你可以做 User.find_by_full_name('John Carver')

响应需求变化的新东西

named_scope :find_by_full_name, lambda {|full_name| 
  {:conditions => ["first LIKE '%?%' or last LIKE '%?%'", 
    full_name.split(' ').first, full_name.split(' ').last]}}


 类似资料:
  • 使用Spring Boot时如何提供Hibernate搜索参数? 它不在乎我提供什么。默认设置总是得到应用。 我认为下面的代码没有任何处理与Hibernate搜索相关的属性的内容。这就是问题所在吗? https://github.com/spring-projects/spring-boot/blob/master/spring-boot-autoconfigure/src/main/java/o

  • 我可以搜索正常的查询。包含来自elasticsearch uri search的字段值或排序,但无法运行uri search的术语聚合查询。 我怎么能做到这一点? 术语聚合查询是: curl-u-elastic-XGET'127.0.0.1:9200/indexname/typename/\u搜索?pretty'-d'{“size”:0,aggs:{“groupu by_field”:{“term

  • 我使用Elasticsearch允许用户输入要搜索的术语。例如,我要搜索以下属性'name': 如果使用以下代码搜索或,我希望返回此文档。 我尝试过做一个bool must和做多个术语,但它似乎只有在整个字符串都匹配的情况下才起作用。 所以我真正想做的是,这个词是否以任何顺序包含两个词。 有人能帮我走上正轨吗?我已经在这上面砸了一段时间了。

  • 问题内容: 我只是从ElasticSearch开始,然后尝试基于它来实现自动完成功能。 我有一个带有type 字段的索引。这是存储在该索引中的文档的示例: 分析配置如下所示: 映射: 我将以下查询发送到ES: 结果,我得到以下信息: 在大多数情况下,它是有效的。在用户必须实际键入整个单词之前,它确实找到了带有的文档(足够了)。 这就是我的问题。我也希望它返回。要获取,我需要发送以下查询: 注意那里

  • 如何获得空数组和美国的结果和

  • 问题内容: 如何通过属性区分已发布的OSGI服务,这些服务实现了相同的接口? 问题答案: 假设您要基于属性的某些值来检索注册的服务,则需要使用 过滤器 (基于LDAP语法)。 例如: 您想在其中查找实现且属性值等于的服务。 这是获取参考的相关javadoc。 备注1: 上面的示例和javadoc引用了发行版4.2。如果您不限于J2SE 1.4运行时,建议您看一下Release 4.3 语法,您可以