2013-10-17 53 views
0

我有一个记录调用的应用程序。每个呼叫可以有多个与之关联的单位。我的应用程序的一部分有一个报告部分,它基本上只针对不同的标准对Call模型进行查询。我已经想出了如何编写一些我想要的范围,并将它们链接到我的报告搜索功能的结果。但我无法弄清楚如何用“单元”进行搜索。下面是从我的代码相关摘录:有关联和ActiveRecord的范围

Call.rb 

    has_many :call_units 
    has_many :units, through: :call_units 

     #Report search logic 
      def self.report(search) 
      search ||= { type: "all" } 

      # Determine which scope to search by 
      results = case search[:type] 
         when "open" 
         open_status 
         when "canceled" 
         cancel 
         when "closed" 
         closed 
         when "waitreturn" 
         waitreturn 
         when "wheelchair" 
         wheelchair 
         else 
         scoped 
         end 

#Search results by unit name, this is what I need help with. Scope or express otherwise?   
results = results. ?????? 

      results = results.by_service_level(search[:service_level]) if search[:service_level].present? 
      results = results.from_facility(search[:transferred_from]) if search[:transferred_from].present? 
      results = results.to_facility(search[:transferred_to]) if search[:transferred_to].present? 

      # If searching with BOTH a start and end date 
      if search[:start_date].present? && search[:end_date].present? 
       results = results.search_between(Date.parse(search[:start_date]), Date.parse(search[:end_date])) 

       # If search with any other date parameters (including none) 
      else 
       results = results.search_by_start_date(Date.parse(search[:start_date])) if search[:start_date].present? 
       results = results.search_by_end_date(Date.parse(search[:end_date])) if search[:end_date].present? 
      end 

      results 
      end 

因为我有台协会已经,我不知道我是否需要为单位范围内以某种方式或在结果变量在某种程度上表达了我的结果搜索逻辑。

+0

这么多的代码,但我仍然不知道你在问什么。 'by_unit_name'应该做些什么?你为什么要发布所有没有什么可以做你真正想要的东西?请举一个你问题出在哪里的简单例子,然后在这里发布。 – phoet

+0

我正在寻找创建一个结果变量,这将允许我通过单元名称进行搜索。所以在我的报告视图中,我可以选择单位名称并按单位名称过滤调用结果。我真的不确定是否需要编写一个范围来执行此操作,或者如果我可以在结果变量中表示这一点。我删除了额外的代码并评论我需要帮助的地方。 – nulltek

回答

1

基本上,你想要一个使用连接的范围,所以你可以使用where条件来对付相关的模型?那是对的吗?

所以在SQL你正在寻找类似

select * from results r 
    inner join call_units c on c.result_id = r.id 
    inner join units u on u.call_unit_id = c.id 
    where u.name = ? 

和范围将是(从内存中,我还没有调试这)是这样的:

scope :by_unit_name, lambda {|unit_name| 
    joins(:units).where('units.unit_name = ?', unit_name) 
} 

units.name不是db中的列。将其更改为units.unit_name没有引发异常,似乎是我想要的。下面是我在我的结果变量:

results = results.by_unit_name(search[:unit_name]) if search[:unit_name].present? 

当我尝试用不同的单位名称没有结果显示搜索。这里是我用来搜索的代码:

<%= select_tag "search[unit_name]", options_from_collection_for_select(Unit.order(:unit_name), :unit_name, :unit_name, selected: params[:search].try(:[], :unit_name)), prompt: "Any Unit" %> 
+0

你可以发布查询的查询日志吗?您应该能够看到rails正在尝试运行的确切SQL(假设您正在开发环境中运行)。 – GSP

+0

SELECT“calls”。* FROM“calls”INNER JOIN“call_units”ON“call_units”。“call_id”=“calls”。“id”INNER JOIN“call_units”“call_units_calls_join”ON“call_units_calls_join”。“call_id”=“调用“。”id“INNER JOIN”units“ON”units“。”id“=”call_units_calls_join“。”unit_id“WHERE(units.unit_name ='1')ORDER BY incident_number ASC LIMIT 10 OFFSET 0 – nulltek

+0

我认为问题它是选择unit_name等于unit.id,它是一个整数而不是字符串。所以也许我的select_tag代码是错误的? – nulltek