在ActiveAdmin中筛选父对象属性

时间:2011-10-26 22:09:37

标签: ruby-on-rails activeadmin

我希望能够根据对象父级的属性过滤对象:

class Call < ActiveRecord::Base
  belongs_to :user
end

class User < ActiveRecord::Base
  has_many :calls
end

我希望能够做到这一点:

ActiveAdmin.register Call do
  filter :user
end

并让它过滤user.name,而不是显示所有用户的选择。可以这样做吗?

5 个答案:

答案 0 :(得分:30)

丹尼斯的解决方案几乎对我有用。我只需要添加过滤器类型。例如:

ActiveAdmin.register Call do
  filter :user_name, :as => :string
end

答案 1 :(得分:8)

试试这个:

ActiveAdmin.register Call do
  filter :user_name
end

由于ActiveAdmin使用meta_search过滤器,因此他们的文档非常有用:https://github.com/ernie/meta_search

答案 2 :(得分:3)

您可以使用ActiveAdmin使用的InheritedResource中的嵌套资源,因此您的列表会被父级自动过滤。

ActiveAdmin.register User do
  # this is the parent resource
end

ActiveAdmin.register Call do
  belongs_to :user # nested below resource user
end

然后,您可以使用rake路由查看由ActiveAdmin生成的新嵌套路由:)希望有所帮助

答案 3 :(得分:2)

在下一版ActiveAdmin(我使用1.0.0.pre)中,您可以使用Ransack方法。所以,假设你有一篇文章,属于用户。

您将拥有以下admin / article.rb文件

ActiveAdmin.register Article do

  controller do
    def scoped_collection
      Article.includes(:user)
    end
  end  

  index do      
   column :id
   column :created_at
   column :title
   column("Author", sortable: 'users.first_name') { |item| link_to item.user.full_name, user_path(item.user) }
   actions
  end

  filter :user_first_name_cont, :as => :string
  filter :user_last_name_cont, :as => :string  

end

这里,user_first_name_cont是一种搜索方法,它过滤关联的用户first_name,'cont'意味着包含。

答案 4 :(得分:0)

我想说这很大程度上取决于您的模型之间的关联类型-我花了几个小时才弄清楚这一点。

示例

sqlText = "select * from dual"

要根据用户的电子邮件过滤用户,请执行此操作(不要忘记class User < ActiveRecord::Base belongs_to :user end class Email < ActiveRecord::Base has_one :email end 部分,因为它使您可以访问Ransack搜索方法,例如包含等)

as: :string