在Rails中过滤另一个表的属性(一对多)

时间:2019-03-18 07:36:32

标签: ruby-on-rails

在Rails中使用另一个表的属性(一对多)进行过滤

我是Rails的初学者,目前正在从事我的课堂项目。我有一个线索和一个lead_comments表,线索has_many lead_comments和lead_comment当属Lead,这是我建立的。

在模型中:

<div class="date-search">
  <%= form_tag leads_path, method: :get do %>
    <%= date_field_tag 'date_search[date_from]', @date_search.date_from %>
    <%= date_field_tag 'date_search[date_to]', @date_search.date_to %>
    <%= submit_tag 'Date Search' %>
  <% end %>
</div>

<table>
  <thead>
    <tr>
      <th>First Name</th>
      <th>Last Name</th>
      <th>Phone Number</th>
      <th>Last Updated Date</th>
      <th colspan="3">Action</th>
    </tr>
  </thead>

  <tbody>
    <% @leads.each do |lead| %>
      <tr>
        <td><%= lead.lead_firstname %></td>
        <td><%= lead.lead_lastname %></td>
        <td><%= lead.lead_phone %></td>
        <td><%= lead.lead_comments.maximum(:updated_at) %></td>
        <td><%= link_to 'Detail', lead %></td>
        <td><%= link_to 'Edit/Update', edit_lead_path(lead) %></td>
        <td><%= link_to 'Remove', lead, method: :delete, data: { confirm: 'Are you sure?' } %></td>
      </tr>
    <% end %>
  </tbody>
</table>

在销售线索的索引视图中,我试图基于Lead_comments中的Update_at设置日期过滤器,这是另一个表的属性:

def index
    @date_search = LeadSearch.new(params[:date_search])
    @leads = @date_search.scope
end

在潜在顾客控制器中,我设置了另一个潜在顾客搜索控制器:

class LeadSearch
  attr_reader :date_from, :date_to

  def initialize(params)
    params ||= {}
    @date_from = parsed_date(params[:date_from], 30.days.ago.to_date.to_s)
    @date_to = parsed_date(params[:date_to], Date.today.to_s)
  end

  def scope
    Lead.lead_comments.maximum(:updated_at).where('updated_at BETWEEN ? AND ?', @date_from, @date_to)
  end

  private

  def parsed_date(date_string, default)
    Date.parse(date_string)
  rescue ArgumentError, TypeError
    default
  end
end

在潜在顾客搜索模型中,我认为问题出在哪里:

{{1}}

我的lead_comment表只有一个属性,即comment,以及Rails创建的两个自动日期属性created_at和updated_at。

每当我运行该应用程序时,我都会得到一个错误,告诉我未定义的方法“ lead_comments”。我以为我已经建立了has_many和belong_to关系,但这仍然无法正常工作。有人可以帮助我,并指导我朝正确的方向发展吗?谢谢您的宝贵时间。

2 个答案:

答案 0 :(得分:0)

您正在执行Lead.lead_comments,这是错误的。您正在使用类名而不是对象。应该有一个潜在顾客模型的对象。

@lead.lead_comments

首先,在Rails控制台中尝试查询。然后在控制器中使用它以获得更好的视角。尝试跟随,

Lead.lead_comments # will give error

代替使用

Lead.last.lead_comments # success

答案 1 :(得分:0)

您的代码中出现了

  1. Lead.lead_comments

让我们简化一下:将lead_comments视为给定线索返回其注释的方法。但是我们需要带头。这就是为什么在Lead上调用不起作用的原因。可以在Lead对象上调用它。

  1. Lead.lead_comments.maximum(:updated_at)

在这里,您通过ActiveRecord组成了一个SQL查询,但是调用maximum停止了此组合,因为它需要一个值,因此您无法在诸如maximum之类的方法之后调用其他任何东西

让您的代码正常工作

def scope
  Lead.where('updated_at BETWEEN ? AND ?', @date_from, @date_to)
end

您认为

<td><%= lead.lead_comments.maximum(:updated_at) %></td>

请注意,此代码始终是正确的,因为您在引导对象上调用lead_comments

我知道,此操作对每个Lead对象执行一个查询,但要使其仅与一个查询一起使用,看起来就像是另一个问题