簡體   English   中英

如何將一個arel對象合並到ActiveRecord :: Relation鏈中?

[英]how to merge an arel object into an ActiveRecord::Relation chain?

我知道如何將以下內容轉換為使用嚴格的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(:地址).merge(Address.anywhere(QUERY_TERM))

(更不用說注入也不是很優雅-我該如何改善?)

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM