Active Admin和has_one

时间:2017-11-06 16:48:07

标签: ruby-on-rails activeadmin

我正在尝试让我的用户模型在ActiveAdmin中工作,但它似乎只有在我将模型引用回用户模型本身时才会起作用,然后在我的应用程序中打破我的表单。

这种方法会破坏我的ActiveAdmin用户视图,但表单可以在我的应用中使用。

user.rb

class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  has_many :vehicle
  has_one :permit
  has_one :faculty
  has_one :emergency_contact
  has_one :student

  def admin?
    roles == "admin"
  end

  def editor?
    roles == "editor"
  end

  def standard?
    roles == "standard"
  end

end

user.rb

has_many :vehicle, class_name: 'User'
has_one :permit, class_name: 'User'
has_one :faculty, class_name: 'User'
has_one :emergency_contact, class_name: 'User'
has_one :student, class_name: 'User'

第二种方式是让我的ActiveAdmin用户视图工作(我知道这是错误的,只是不知道如何解决它)但它在我的应用程序中打破了我的表单。当ActiveAdmin中断时,我收到错误: 当我在ActiveAdmin中单击用户视图时undefined method 'vehicle_id_eq' for Ransack::Search<class: User

任何人对我如何修复模型以使ActiveAdmin正常工作有任何想法?

编辑**

管理员/ user.rb

ActiveAdmin.register User do
    permit_params :roles
end

模型/ vehicle.rb

class Vehicle < ApplicationRecord
    belongs_to  :user
end

1 个答案:

答案 0 :(得分:1)

ActiveAdmin正在尝试为User模型上的所有关联创建过滤器。这似乎包括您的has_many关联(我猜也是has_one)。这是一个非常简单的案例,AA似乎试图默认为has_onehas_many关联创建过滤器。它可能值reporting on Github。与此同时,有几种方法可以解决这个问题。

  1. 指定您自己的过滤器
  2. admin/user.rb

    中的

    ActiveAdmin.register User do
        permit_params :roles
    
        filter :name
        filter :email
        # or you can remove filters with => remove_filter :vehicles
        #... add more filters that as you need.
    end
    

    通过这种方式,您可以使用实际用于查找单个或一组用户的过滤器。

    1. 您可以joininclude被引用的模型。如果您真的计划通过任何这些关联过滤用户,我只推荐此。如果没有,请使用上面提到的第一种方法。
    2. admin/user.rb

      中的

      ActiveAdmin.register User do
          permit_params :roles
      
          controller do
            active_admin_config.includes.push :vehicles, :permit #,... etc.
      
            # IF YOU INCLUDE A `has_many`, you need to ensure you are not 
            # returning duplicate resources. So you need to overwrite
            # the apply_filtering method
            def apply_filtering(collection)
              super.where(User.primary_key => collection)
            end
          end
      end