在has_one上搜索Ransack:通过(别名)

时间:2017-11-28 23:15:12

标签: ruby-on-rails ruby ransack

我尝试使用ransack搜索模型中has_one关联的属性。
目前在我的模型中我有:

class SurveyResponse < ActiveRecord::Base
  belongs_to :course_schedule 
  has_one :instructor, through: :course_schedule
  has_one :instructor_user, through: :instructor, foreign_key: "user_id", source: :user 

我想在调查回复视图中按instructor_user's名称进行搜索。我应该和搜索者一起做这件事吗?我对Arel的理解非常有限,但我可以这样做吗? (我知道这不会起作用......)

def self.ransackable_attributes(auth_object)
[
  'created_at',
  'instructor_user_name'
]
end

ransacker :instructor_user_name, type: :string do 
  Arel.sql('string(survey_responses.instructor_user.last_name)')
end 

在我的调查回复控制器中,我目前有:

def index
  @search_associations = [:course, :user]

  @q = SurveyResponse.where(corporation_id: @corporation.id).ransack(params[:q])

  @q.build_condition

  @survey_responses =  @q.result.includes(:course, :user, :course_schedule, :instructor, :instructor_user).order(created_at: :asc)

  @survey_responses = paginate(@q)
end

非常感谢任何帮助,资源和指导。

1 个答案:

答案 0 :(得分:0)

我认为你不需要专门的搜索者。我相信你的观点,在<%= f.search_field :instructor_user_name %> 内你只是可以做到:

@survey_responses = paginate(@q)

此外,在您的控制器中而不是@survey_responses = paginate(@survey_responses)我认为您需要require_relative 'boot' require 'rails/all' Bundler.require(*Rails.groups) require "google/cloud/logging/rails" module StackTest class Application < Rails::Application config.google_cloud.logging.project_id = "valid-project-id" config.google_cloud.logging.keyfile = "config/stackdriver.json" config.google_cloud.use_logging = true config.google_cloud.logging.log_name = 'stackdriver-puma-test' end end ,因此您可以对响应进行分页而不是搜索对象(根据您的分页宝石可能会出错)使用)。