Rails应用程序:如何使用简单的搜索方法搜索关联的模型?

时间:2017-01-24 00:51:22

标签: ruby-on-rails search associations rails-activerecord

我一直在使用简单的搜索方法为应用程序的几个部分实现搜索功能。方法和控制器索引操作如下所示。

索引操作(participant_controller.rb)

def index if params[:search] @participants = Participant.search(params[:search]) else @participants = Participant.all end end

参与者模型(participant.rb)

def self.search(terms) if terms where("email ILIKE ?", "%#{terms}%") end end

我遇到的问题是我不仅需要通过电子邮件进行搜索(现在是如何设置self.search方法的。)但我还需要按名字和姓氏(f_name,l_name)进行搜索。但是此信息位于名为ParticipantDetail的关联模型中。

我尝试了以下但是我得到了一个没有方法参与者_detail'错误

def index if params[:search] @participants = Participant.participant_detail.search(params[:search]) else @participants = Participant.all end end 我也尝试过这样的搜索...

def index if params[:search] @participants = ParticipantDetail.search(params[:search]) else @participants = Participant.all end end

但这实际上并不好,因为它只会显示相关记录而不会显示belowned_to(父)记录。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

假设ParticipantDetail belongs_to :participantParticipant has_one :participant_detail,请使用INNER JOIN

Participant
  .select('participants.*')
  .select('participant_details.f_name, participant_details.l_name')
  .joins(:participant_details)
  .where('participants.email ILIKE :search OR participant_details.f_name ILIKE :search OR participant_details.l_name ILIKE :search', search: terms)

答案 1 :(得分:1)

search方法中,您可以添加以下内容:

joins(:participant_detail).where("participant_detail.f_name ILIKE :search OR participant_detail.l_name ILIKE :search OR email ILIKE :search", :search => "%#{terms}%")

并使用@participants = Participant.search(params[:search])来调用它。