双重加入 rails 查询
Double Join in rails query
我有下面这三个表
office.rb
has_many :documents
has_one :information
information.rb
belongs_to :office
document.rb
belongs_to :office
我正在尝试编写如下查询
documents_controller.rb
def search
@documents = Document.all
@documents.joins(:office).where("offices.name ILIKE ?", "%#{params[:search]}%") OR @documents.joins(:office).joins(:information).where("informations.first_name ILIKE ? OR informations.last_name ILIKE ?", "%#{params[:search]}%", "%#{params[:search]}%")
end
我正在努力实现上述声明,但我做错了。请帮我解决这个问题
因此,我们的想法是检索以办公室名称为搜索词或以信息 first/last 名称为搜索词的任何文档,对吗?
第一步是创建连接:
Document.joins(office: :information)
第二步创造条件:
where("offices.name ILIKE :term OR informations.first_name ILIKE :term OR informations.last_name ILIKE :term", term: "%#{params[:search]}%")
并加入两个句子:
Document.joins(office: :information).where("offices.name ILIKE :term OR informations.first_name ILIKE :term OR informations.last_name ILIKE :term", term: "%#{params[:search]}%")
还有其他奇特的方法可以做同样的事情,比如使用 or
作用域,但理解起来可能会更复杂:
search_term = "%#{params[:search]}%"
base_query = Document.joins(office: :information)
office_scope = base_query.where("offices.name ILIKE :term", search_term)
first_name_scope = base_query.where("informations.first_name ILIKE :term", search_term)
last_name_scope = base_query.where("informations.last_name ILIKE :term", search_term)
office_scope.or(first_name_scope).or(last_name_scope)
我有下面这三个表
office.rb
has_many :documents
has_one :information
information.rb
belongs_to :office
document.rb
belongs_to :office
我正在尝试编写如下查询
documents_controller.rb
def search
@documents = Document.all
@documents.joins(:office).where("offices.name ILIKE ?", "%#{params[:search]}%") OR @documents.joins(:office).joins(:information).where("informations.first_name ILIKE ? OR informations.last_name ILIKE ?", "%#{params[:search]}%", "%#{params[:search]}%")
end
我正在努力实现上述声明,但我做错了。请帮我解决这个问题
因此,我们的想法是检索以办公室名称为搜索词或以信息 first/last 名称为搜索词的任何文档,对吗?
第一步是创建连接:
Document.joins(office: :information)
第二步创造条件:
where("offices.name ILIKE :term OR informations.first_name ILIKE :term OR informations.last_name ILIKE :term", term: "%#{params[:search]}%")
并加入两个句子:
Document.joins(office: :information).where("offices.name ILIKE :term OR informations.first_name ILIKE :term OR informations.last_name ILIKE :term", term: "%#{params[:search]}%")
还有其他奇特的方法可以做同样的事情,比如使用 or
作用域,但理解起来可能会更复杂:
search_term = "%#{params[:search]}%"
base_query = Document.joins(office: :information)
office_scope = base_query.where("offices.name ILIKE :term", search_term)
first_name_scope = base_query.where("informations.first_name ILIKE :term", search_term)
last_name_scope = base_query.where("informations.last_name ILIKE :term", search_term)
office_scope.or(first_name_scope).or(last_name_scope)