具有关联和ActiveRecord的范围

时间:2013-10-17 16:19:25

标签: ruby-on-rails-3 search activerecord scope

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

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

由于我已经有单位的关联,我不确定是否需要以某种方式为单位制作作用域,或者在搜索逻辑中的结果变量中以某种方式表达结果。

1 个答案:

答案 0 :(得分: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" %>