问题
我试着把我的头缠在arel和squel身上,但我觉得我缺乏词汇去问google我在找什么。
有人知道如何从组合的对象中模仿squel的Model.where{related.objects.field.matches string}语法吗?
问题
This question演示如何从字符串构建一个screel keypath,如下所示:

search_relation = 'person.pets'
User.joins{Squeel::Nodes::KeyPath.new(search_relation.split('.'))}
# Mimics User.joins{person.pets}

this post中,图变厚了,在这里我学会了如何跨多个列对搜索进行元编程。用documented Squeel trick清理(页面的最后一行),它看起来如下:
search_columns = %w[first_name last_name]
search_term = 'chris'
User.where{
  search_columns.map do |column|
    column_stub = Squeel::Nodes::Stub.new(column)
    Squeel::Nodes::Predicate.new(column_stub, :matches, "%#{search_term}%")
  end.compact.inject(&:|)
}
# Mimics User.where{(last_name.matches '%chris%') | (first_name.matches '%chris%')}

我想要的是能够将两者结合起来,模仿
User.joins{person.pets}.where{person.pets.name.matches '%polly%'}

通过我自己建造橡皮圈。
第一部分很简单,在第一个例子中演示。第二部分我可以直接对查询表上的列执行,如第二个示例所示。
但是,我不知道如何对联接表中的列执行第二部分。我认为需要使用第一个示例中的Squeel::Node对象来确定第二个示例中的KeyPath对象的范围。Predicate对象似乎只与表示单个表上的单个列的Predicate对象一起工作,而不是与Stub对象一起工作。
以前的尝试
相加
search_relation = 'key.path'
search_column = 'field'
search_term = '%search%'
keypath = Squeel::Nodes::KeyPath.new(search_relation.split('.') << search_column)

我试过在keypath上调用KeyPath方法:
Model.where{keypath.matches search_term}
#=> NoMethodError: undefined method `matches' for Squeel::Nodes::KeyPath

我试过使用matches操作符,matches
Model.where{keypath =~ search_term}
#=> TypeError: type mismatch: String given

我试着手动构建=~,传入一个Predicate参数:
Model.where{Squeel::Nodes::Predicate.new(keypath, :matches, search_term)}
#=> ActiveRecord::StatementInvalid: Mysql2::Error: Unknown column
#=>   'model.key.path.field' in 'where clause':
#=>   SELECT `model`.* FROM `model`
#=>     INNER JOIN `key` ON `key`.`id` = `model`.`key_id`
#=>     INNER JOIN `path` ON `path`.`id` = `key`.`path_id`
#=>     WHERE `model`.`key.path.field` LIKE '%search%'

在这里,它成功地生成了sql(为了可读性,上面省略了使用:matches的正确连接),然后假设Model.joins{search_relation}是一个字段,而不是遍历它。

最佳答案

克里斯,
你在正确的轨道上。只需在keypath对象上调用matches方法,就会创建一个matches谓词,keypath在左侧,参数在右侧。squel的访问者将遍历左边的keypath,得到有问题的属性,并根据该属性构建匹配的arel谓词。

关于ruby-on-rails - 元程序Squeel搜索关键路径,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13579613/

10-11 15:18