Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何将arel对象合并到ActiveRecord::关系链中?_Ruby On Rails_Ruby On Rails 3_Activerecord_Arel_Activerecord Relation - Fatal编程技术网

Ruby on rails 如何将arel对象合并到ActiveRecord::关系链中?

Ruby on rails 如何将arel对象合并到ActiveRecord::关系链中?,ruby-on-rails,ruby-on-rails-3,activerecord,arel,activerecord-relation,Ruby On Rails,Ruby On Rails 3,Activerecord,Arel,Activerecord Relation,我知道如何将以下内容转换为使用严格的Arel方法,而不是混合sql/string,但我不知道如何将生成的Arel对象合并到ActiveRecord::Relation中,以便在其上链接更多的AR::Relation方法 对于我的上一个问题,我得到了以下非常有用的答案: class Address < ActiveRecord::Base scope :anywhere, lambda{|search| attrs = [:line1, :line2, :city, :state

我知道如何将以下内容转换为使用严格的Arel方法,而不是混合sql/string,但我不知道如何将生成的Arel对象合并到ActiveRecord::Relation中,以便在其上链接更多的AR::Relation方法

对于我的上一个问题,我得到了以下非常有用的答案:

class Address < ActiveRecord::Base
  scope :anywhere, lambda{|search|
    attrs = [:line1, :line2, :city, :state, :zip]
    where(attrs.map{|attr| 
      "addresses.#{attr} LIKE :search"
    }.join(' OR '), search: "#{search}%").order(*attrs) 
  }
end

Person.joins(:address).merge(Address.anywhere(query_term))
类地址
我试着这样做:

class Address < ActiveRecord::Base
  scope :anywhere, lambda{|search|
    addr_arel = Address.arel_table
    attrs = [:line1, :line2, :city, :state, :zip]
    attrs.inject {|attr| 
      q = addr_arel[attr].match("%#{search}%") unless q
      q = q.or(addr_arel[attr].match("%#{search}%")
    }
  }
end
类地址
但我最终得到了一个arel对象,我不知道如何将其与以下ActiveRecord::Relation合并:

Person.joins(:address).merge(address.anywhere(查询词))


(更不用说注入也不是很优雅-如何改进?

ActiveRecord::Relation.where接受ARel谓词,因此在本例中,您可以直接将最终谓词传递给Address.where

class Address < ActiveRecord::Base
  scope :anywhere, -> search {
    addr_arel = Address.arel_table
    attrs = [:line1, :line2, :city, :state, :zip]

    where attrs
      .map {|attr| addr_arel[attr].matches("%#{search}%")}
      .inject(:or)
  }
end
类地址搜索{
addr\u arel=Address.arel\u表
属性=[:line1,:line2,:城市,:州,:zip]
在哪里
.map{| attr | addr|u arel[attr].匹配项(“%#{search}%”)
.注入(:或)
}
结束