1

嗨,我正在开发一个使用 devise 和 ActiveAdmin 的 Rails 3.2.9 应用程序。我有用户和公司等模型。我希望管理员从特定公司的注册用户列表中选择一位经理。

我的用户表有这些字段:id、用户名、电子邮件、company_id、密码等

我公司的表有:id、company_name、manager_id(这只是用户的 id)、created_at 等

我编写的以下代码显示了所有公司的用户。单击编辑后,我只希望该特定公司的用户显示在下拉列表中。

这是我的 company.rb 管理员文件

ActiveAdmin.register Company do
  index do
    column "Company", :name
    column :address
    column "No. of Subscriptions", :no_of_licenses
    column "Manager", :manager_id
    default_actions
  end
  filter :name

  form do |f|
    f.inputs "Company Details" do
      f.input :name
      f.input :address
      f.input :no_of_licenses, :label => 'No of Subscriptions'
      #THIS LINE NEEDS TO BE CHANGED
      f.input :manager_id, :as => :select, :collection => User.joins('LEFT OUTER JOIN companies ON users.company_id = companies.id').map{|u| [u.username, u.id]} 
    end
    f.buttons
  end  
end

编辑1:

我添加了一个控制器,并按照 jeremy04 的建议进行了更改。在用户模型中添加一个方法并从该控制器的编辑操作中调用它。我现在收到一个错误,例如

 NoMethodError in Admin::CompaniesController#edit

undefined method `[]' for nil:NilClass

Rails.root: D:/WS/som_new
Application Trace | Framework Trace | Full Trace

app/admin/companies.rb:9:in `edit'

我的公司.rb 文件现在看起来像这样

ActiveAdmin.register Company do

  controller do
      # This code is evaluated within the controller class

      def edit
        puts "IN EDIT"
        #@user_with_companies=[]
        @user_with_companies = User.users_with_company(params[:company][:name]).pluck(:username)
        puts @user_with_companies
      end

    end


  index do
    some code...
  end
  filter :name


  form do |f|
    f.inputs "Company Details" do
      f.input :name
      f.input :address
      f.input :no_of_licenses, :label => 'No of Subscriptions'
      f.input :manager_id, :as => :select, :collection => @user_with_companies #.map{|u| [u.username, u.id]}

    end
    f.buttons
  end 

结尾

4

1 回答 1

0

你几乎明白了,我建议在你的用户模型中执行 SQL 逻辑(创建一个可以传入公司名称的方法)或使用范围。

def self.users_with_company(company)
  User.joins(:company).where("companies.name = ?", company)
end

然后在您的控制器上的编辑操作中调用您的新方法:

@user_with_companies = User.users_with_company(params[:company][:name])

然后:

:collection => @user_with_companies.map .. .etc。

于 2013-06-24T12:52:43.337 回答