【问题标题】:Rails App: How do I use a simple search method to search through associated models?Rails App:如何使用简单的搜索方法搜索关联模型?
【发布时间】:2017-06-08 15:58:44
【问题描述】:

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

索引操作 (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 的关联模型中。

我尝试了以下方法,但出现“无方法参与者详细信息”错误

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

但这实际上并不好,因为它只显示关联的记录,而不是belonged_to(父)记录。

任何帮助将不胜感激。

【问题讨论】:

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


    【解决方案1】:

    假设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)
    

    【讨论】:

    • 我在第一个选择行私有方法 `select' 调用“the_term_i entered”时出现以下错误:String
    • select 不是私有方法。确保你在 Participant 上调用它,它需要是一个 ActiveRecord 模型(不是普通的 ruby​​ 类)
    • 我错误地实施了您的解决方案。我完全按照您的方式尝试了它,现在我得到了……现在我得到了 Can't join 'Participant' to association named 'participant_details';也许你拼错了?我玩过拼写和复数,这似乎并不重要。我仍然收到此错误。 ://
    • 好吧,没关系。谢谢你。这就是解决方案。 ":participant_details" 必须写成单数。
    • 两种最常见的连接类型是INNER JOINLEFT JOIN。 DB 连接基本上基于 2 个输入表和输出的每个组合创建一个“punnet square”。 100 条记录与 100 条记录与 100 条记录相连可以产生 100 万行。这就是 WHERE 子句的用武之地。当您编写 joins() 时,它隐藏在您的代码中,但是如果您在控制台中查看 SQL 查询输出,您会看到它只显示了百万中的记录,其中 participant_details.participant_id = participants.id
    【解决方案2】:

    在您的 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]) 调用它。

    【讨论】:

    • 在视图的@participants.each 行我收到以下错误code PG::UndefinedTable: ERROR: missing FROM-clause entry for table "participant_detail" LINE 1: ... ls"."participant_id" = "participants"."id" WHERE (participan... ^ : SELECT "participants".* FROM "participants" INNER JOIN "participant_details" ON "participant_details"."participant_id" = "participants"。 "id" WHERE (participant_detail.f_name ILIKE '%kiana%' ORparticipant_detail.l_name ILIKE '%kiana%' OR email ILIKE '%kiana%')code
    • code
      参与者 %>
      code 我为格式化道歉。我正在努力为 cmets 找出这个迷你降价
    • 触发错误的行是“@participants.each do”行
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多