【问题标题】:Searching polymorphic relation using ransack gem使用 ransack gem 搜索多态关系
【发布时间】:2015-12-22 12:03:32
【问题描述】:

我在搜索关系字段时遇到了洗劫问题。我的模型如下:

# Model to search in
class Pass < ActiveRecord::Base
    belongs_to :user, polymorphic: true
    belongs_to :admin
    belongs_to :last_owner, polymorphic: true
end

# User class having phone
class User < ActiveRecord::Base
    has_many :passes
    has_many :owned_passes, class_name: 'Pass', foreign_key: 'owner_id'
    has_many :last_owned_passes, class_name: 'Pass', foreign_key: 'last_owner_id'
end

# Doesn't have phone column
class Admin < ActiveRecord::Base
    has_many :passes
    has_many :owned_passes, as: :owner, class_name: 'Pass', foreign_key: :owner_id
    has_many :last_owned_passes, as: :last_owner, class_name: 'Pass', foreign_key: :last_owner_id
end

#Doesn't have phone column
class Moderator < Admin
end

在控制器中,索引操作负责搜索:

class Dashboard::PassesController < Dashboard::BaseController
    def index
        @query  = scope.search(params[:q])
        @passes = @query.result(distinct: true).page(page)
    end
private
    def scope
        scope = current_dashboard_admin.passes
        scope = scope.where(parent_id: params[:parent_id]) if params.key? :parent_id
        scope = scope.order(created_at: :desc)
        scope = scope.where(type: 'Pass')
        scope
    end
end

根据关于 ransack 的文档:https://github.com/activerecord-hackery/ransack search_form_for 如下:

= search_form_for [:dashboard, @query] do |f|
  .form-body
     .form-group
       = f.label :user_phone_cont
       = f.text_field :user_phone_cont, class: 'form-control'

运行此代码会导致错误:未定义方法 `user_phone_cont' for Ransack::Search>:Ransack::Search

我尝试将索引操作更改为如下:@passes = @query.result.includes(:user).page(page),但这不起作用并导致相同的错误。我试图将 text_field 更改为 search_field,结果相同。我还尝试通过在 Pass 模型中添加以下行来修改 Pass 模型中的关系,从而将用户关系放在 2 行上,以区分类为 User 的用户和其他任何人:belongs_to :normal_user, -&gt; { where(user_type: 'User') },然后将表单修改为normal_user_phone_cont,这导致与未定义的属性/方法的命名更改相同的错误。

任何帮助将不胜感激,并提前感谢您阅读问题。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 ransack


    【解决方案1】:

    我认为使用 Ransack 搜索多态关系需要遵循一些约定,如以下链接所述: https://github.com/activerecord-hackery/ransack/wiki/Polymorphic-searches

    根据您的情况,您应该使用以下约定:user_of_user_type_phone,以便仅搜索用户。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-04
      • 1970-01-01
      • 1970-01-01
      • 2021-11-01
      • 2021-12-29
      相关资源
      最近更新 更多