在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关系,但这仍然无法正常工作。有人可以帮助我,并指导我朝正确的方向发展吗?谢谢您的宝贵时间。
答案 0 :(得分:0)
您正在执行Lead.lead_comments,这是错误的。您正在使用类名而不是对象。应该有一个潜在顾客模型的对象。
@lead.lead_comments
首先,在Rails控制台中尝试查询。然后在控制器中使用它以获得更好的视角。尝试跟随,
Lead.lead_comments # will give error
代替使用
Lead.last.lead_comments # success
答案 1 :(得分:0)
您的代码中出现了
Lead.lead_comments
让我们简化一下:将lead_comments
视为给定线索返回其注释的方法。但是我们需要带头。这就是为什么在Lead
上调用不起作用的原因。可以在Lead
对象上调用它。
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
对象执行一个查询,但要使其仅与一个查询一起使用,看起来就像是另一个问题