Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3 具有关联和ActiveRecord的作用域_Ruby On Rails 3_Search_Activerecord_Scope - Fatal编程技术网

Ruby on rails 3 具有关联和ActiveRecord的作用域

Ruby on rails 3 具有关联和ActiveRecord的作用域,ruby-on-rails-3,search,activerecord,scope,Ruby On Rails 3,Search,Activerecord,Scope,我有一个记录电话的应用程序。每个呼叫可以有多个相关单元。我的部分应用程序有一个报告部分,它基本上只是针对不同的条件对呼叫模型进行查询。我已经知道了如何编写一些作用域来实现我想要的功能,并将它们链接到我的报告搜索功能的结果中。但我不知道如何按“单位”搜索。以下是我的代码的相关摘录: Call.rb has_many :call_units has_many :units, through: :call_units #Report search logic

我有一个记录电话的应用程序。每个呼叫可以有多个相关单元。我的部分应用程序有一个报告部分,它基本上只是针对不同的条件对呼叫模型进行查询。我已经知道了如何编写一些作用域来实现我想要的功能,并将它们链接到我的报告搜索功能的结果中。但我不知道如何按“单位”搜索。以下是我的代码的相关摘录:

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

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

基本上,您想要一个使用联接的作用域,以便在关联模型中使用
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不是数据库中的列。将其更改为units.unit\u名称并没有引发异常,这似乎是我想要的。以下是我的结果变量:

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" %>


这么多代码,但我还是不知道你要什么。按单位名称
应该做什么?为什么你要发布所有与你真正想要的无关的东西?请做一个简单的例子,说明你的问题所在,并将其发布在这里。我希望创建一个结果变量,允许我按单位名称进行搜索。因此,在我的报告视图中,我可以选择一个单位名称,并按单位名称筛选呼叫结果。老实说,我不确定是否需要编写一个作用域来实现这一点,或者是否可以将其表示为一个results变量。我删除了额外的代码,并在需要帮助的地方发表了评论。你能发布搜索的查询日志吗?您应该能够看到rails正在尝试运行的确切SQL(假设您正在开发环境中运行)。选择“调用”。*从“调用单元”中的“调用”内部连接“调用单元”。“调用id”=“调用”。“id”内部连接“调用单元”“调用单元”“调用单元”“调用单元”“调用单元”“调用单元”“id”内部连接“调用单元”“id”=“call\u units\u calls\u join”。“unit\u id”其中(units.unit\u name='1')事件顺序\u编号ASC限制10偏移量0我认为问题在于选择unit\u name等于unit.id的位置,这是一个整数,而不是字符串。也许我的选择标签代码错了?是的,我认为你的评论是对的。另外,(这应该由数据库优化),但是在
呼叫单元上有两个
内部连接
。试着在你的作用域中只执行
连接(:units)
,看看这是否可以消除重复的连接。执行连接(:units)似乎可以修复双内部连接。现在,我正试图找出如何让我的select_标记按unit_名称而不是unit.id进行搜索。有什么想法吗?