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
Ruby on rails 3 Rails形成作用域和持久值_Ruby On Rails 3_Forms_Activerecord_Scope - Fatal编程技术网

Ruby on rails 3 Rails形成作用域和持久值

Ruby on rails 3 Rails形成作用域和持久值,ruby-on-rails-3,forms,activerecord,scope,Ruby On Rails 3,Forms,Activerecord,Scope,我有一个Rails 3.2.18应用程序,我有一个问题 基本上每个记录都是一个调用,每个调用都有许多单元。车辆的一种装置,其状态为(运行中、停止运行等) 创建呼叫时,我只希望列出标记为在用的单元以进行调度。因此,我在单元模型上创建了一个作用域,用于: Unit.rb scope :in_service, lambda { where(status_id: Status.find_by_unit_status("In Service").id)} has_many :call_units has

我有一个Rails 3.2.18应用程序,我有一个问题

基本上每个记录都是一个调用,每个调用都有许多单元。车辆的一种装置,其状态为(运行中、停止运行等)

创建呼叫时,我只希望列出标记为在用的单元以进行调度。因此,我在单元模型上创建了一个作用域,用于:

Unit.rb

scope :in_service, lambda { where(status_id: Status.find_by_unit_status("In Service").id)}
has_many :call_units
has_many :calls, through: :call_units
在我的Calls助手中,我有一个方法,可以选择单元并附加它们的单元类型,以及它们在另一次调用中是否处于活动状态,这样调度员就不会试图双重分派单元

调用\u helper.rb

def unit_select
    Unit.active.order("unit_name").map{|unit| unit.calls.where(call_status: "open").empty? ? ["#{unit.unit_name} #{unit.unit_type.unit_type}", unit.id] : ["#{unit.unit_name} (on call) #{unit.unit_type.unit_type}", unit.id] }
end
 def unit_select
    (@call.units.to_a.uniq + Unit.active.in_service.order("unit_name")).map{|unit| unit.calls.where(call_status: "open").empty? ? ["#{unit.unit_name} #{unit.unit_type.unit_type}", unit.id] : ["#{unit.unit_name} (on call) #{unit.unit_type.unit_type}", unit.id] }
  end
这就是问题所在。如果我将助手方法更改为以下内容:

def unit_select
    Unit.active.in_service.order("unit_name").map{|unit| unit.calls.where(call_status: "open").empty? ? ["#{unit.unit_name} #{unit.unit_type.unit_type}", unit.id] : ["#{unit.unit_name} (on call) #{unit.unit_type.unit_type}", unit.id] }
end
将in_service scope方法附加到unit_select帮助程序,它确实只选择正在使用的单元。这很好,但是当您去编辑呼叫时,如果该单元在创建呼叫后已更改其状态,则该单元将从表单中的记录中删除

_form.html.erb

<%= f.select(:unit_ids, unit_select,  {}, {:multiple => true, :class => 'select'}) %>
现在,这可以工作了,无论单元的状态如何,当您编辑时,单元都会保留在表单中。这就是事情变得奇怪的地方

假设您编辑了该记录,并希望删除该单元并分配一个不同的单元。它不允许你那样做。无论我做什么,它都将继续保持@call.unit_id的值

以下是该协会的情况: Call.rb

Unit.rb

scope :in_service, lambda { where(status_id: Status.find_by_unit_status("In Service").id)}
has_many :call_units
has_many :calls, through: :call_units
除此之外,我在创建回电时发现了另一个问题。(基本上是获取原始通话数据并基于初始通话创建回程。创建回程时,它将在数组中为通话分配两次相同的单元id。因此,通话中似乎有两个单元,但实际上它们是两次列出的相同单元。以下是我在控制器中的回程操作。

调用\u controller.rb

def new_return
    original_call = Call.find(params[:id])
    @call = Call.new(
      caller_name: original_call.caller_name,
      special_equipment_ids: original_call.special_equipment_ids,
      call_status: "open",
      caller_phone: original_call.caller_phone,
      transfer_from_id: original_call.transfer_to_id,
      transfer_from_other: original_call.transfer_to_other,
      facility_from_location: original_call.facility_to_location,
      transfer_to_id: original_call.transfer_from_id,
      transfer_to_other: original_call.transfer_from_other,
      facility_to_location: original_call.facility_from_location,
      patient_name: original_call.patient_name,
      patient_age: original_call.patient_age,
      patient_dob: original_call.patient_dob,
      patient_sex_id: original_call.patient_sex_id,
      insurance_id: original_call.insurance_id,
      nature_id: original_call.nature_id,
      service_level_id: original_call.service_level_id,
      special_equipment_ids: original_call.special_equipment_ids,
      transfer_date: original_call.transfer_date,
      unit_ids: original_call.unit_ids,
      wait_return: "yes",
      parent_call_id: params[:id],

    )
  end
因此,总而言之,我找到了一个折衷的办法,仅限于派遣服务单位接听来电,但面临以下问题

  • 无法从呼叫中删除单元
  • 编辑呼叫时,除非设备处于服务状态,否则不会在表单中显示设备
  • 创建回电时,它将unit_id复制到@call.unit_id中的一个数组中,以便该单元在通话中显示两次
  • 因此,我希望能够在新呼叫中仅选择服务单元,在编辑时使单元显示在表单中,而不管其状态如何,并且在回访呼叫中,仅使单元id包含应分配的单元id的一个实例

    我知道这真的很让人困惑,我很乐意和某人结对,聊天,或者建立一个要点,这样你就可以看到我的代码库了

    非常感谢您的帮助,因为我现在遇到了麻烦

    更新时间:上午10:44

    我已尝试在单位数组中添加.uniq,但仍然存在问题。我的助手方法如下所示:

    调用\u helper.rb

    def unit_select
        Unit.active.order("unit_name").map{|unit| unit.calls.where(call_status: "open").empty? ? ["#{unit.unit_name} #{unit.unit_type.unit_type}", unit.id] : ["#{unit.unit_name} (on call) #{unit.unit_type.unit_type}", unit.id] }
    end
    
     def unit_select
        (@call.units.to_a.uniq + Unit.active.in_service.order("unit_name")).map{|unit| unit.calls.where(call_status: "open").empty? ? ["#{unit.unit_name} #{unit.unit_type.unit_type}", unit.id] : ["#{unit.unit_name} (on call) #{unit.unit_type.unit_type}", unit.id] }
      end
    

    这有意义吗?这是最好的解决方法吗?

    我试图完全理解您的问题,但我必须说我有点困惑。您是否尝试过在unit\u select中分离每个案例,而不是尝试获得完美的一行?据我所知,您希望能够选择:

  • 当表单中的调用是新实例时,仅“在用”单元
  • 编辑现有通话时显示任何单位
  • 现在,正如我所说,我不确定我是否完全理解您的问题,但看起来您正在尝试这样做:

    def unit_select
      units = Unit.active.in_service.order("unit_name")
      if !@call.new_record?
        units += @call.units
      end
      format_unit_select_options(units.uniq)
    end
    
    def format_unit_select_options(units)
      units.map do|unit|
        if unit.calls.where(call_status: "open").empty?
          ["#{unit.unit_name} #{unit.unit_type.unit_type}", unit.id]
        else
          ["#{unit.unit_name} (on call) #{unit.unit_type.unit_type}", unit.id]
        end
      end
    end
    
    你也应该搬家

    Unit.active.in_service.order("unit_name")
    
    在呼叫控制器的新建和编辑操作中,确保帮助者和控制器的责任更容易理解

    现在,当您在calls\u controller中创建回叫时,您是否尝试在原始的\u call.unit\u id上使用uniq以确保该id仅存在一次?这可能只会修复症状,而不是根本原因,但我无法完全理解您的情况


    希望能有所帮助。

    Marc,感谢帮助者的方法。这更简洁,更接近我需要它做的事情。因此,让我澄清一下。当一个新的呼叫实例时,它应该只显示处于服务状态的单元。当编辑呼叫时(如果你想打开多个单元),它应该显示当前分配的单元(无论其状态如何)如果需要,还可以添加一份在职单位列表。我尝试使用您的代码,在回访电话中,我不再分配两次单位ID。我认为我们在这方面做得对。如果我的情况难以理解,我很抱歉,也许我们可以结对?让我们在本周找时间结对。你会在twitter上找到我:@mlainezThank,我同意快来!我会把你加入推特。@jamesjelinek