Rails:如何在连接表中排除包含条目的记录?

时间:2014-08-01 19:00:17

标签: ruby-on-rails activerecord

我有一个带有work_tasks表和work_task_statuses表的rails 4.1应用程序。

它们在work_task_statuses.id = work_tasks.id上连接在一起。

在我的控制器中,我想只提取work_task_statuses表中没有任何记录的work_tasks。

这是models / work_tasks.rb:

require 'rails'
require 'filterrific'



class WorkTask < ActiveRecord::Base

  has_many :work_task_statuses

  scope :without_work_task_statuses, includes(:work_task_statuses).where(:work_task_statuses => { :id => nil })    

end

这是work_tasks_controller.rb:

require 'builder'
require 'will_paginate'
include ActionView::Helpers::NumberHelper

class WorkTasksController < ApplicationController
  before_action :authenticate_user!

  def list
  end

  def index
    @filterrific = Filterrific.new(WorkTask, params[:filterrific])

    @filterrific.select_options = {
      sorted_by: WorkTask.options_for_sorted_by,
      with_work: WorkTask.options_for_select
    }

    @work_tasks WorkTask.filterrific_find(@filterrific).page(params[:page]).without_work_task_statuses(@work_tasks)

    respond_to do |format|
      format.html
      format.js
    end
  end

  def reset_filterrific
    # Clear session persistence
    session[:filterrific_work_tasks] = nil
    # Redirect back to the index action for default filter settings.
    redirect_to action: :index
  end
end

我收到此错误:

undefined method `call' for #<WorkTask::ActiveRecord_Relation:0x007fa0eeab4870>

如何让控制器排除work_task_statuses中有记录的工作任务?

2 个答案:

答案 0 :(得分:2)

在@jkeuhlen的帮助下(帮助我意识到rails 4中的范围语法已经改变)并通过一些进一步的研究我解决了我的问题。

为了未来搜索者的利益,这是最终的工作代码:

型号:

scope :with_work_task_statuses, -> {where.not(:id => WorkTaskStatus.select(:work_task_id).uniq)
  }

控制器:

@work_tasks = WorkTask.filterrific_find(@filterrific).page(params[:page]).with_work_task_statuses

以下是一篇博文,详细解释了它:http://www.lauradhamilton.com/how-to-filter-by-multiple-options-filterrific-rails

答案 1 :(得分:0)

此问题与this other SO question有关。

使用该帖子中最高投票答案的信息并将其应用于您的问题:

WorkTask.includes(:work_task_statuses).where( :work_task_statuses => { :work_task_id => nil } )