Ransacker和Arel在协会领域

时间:2017-03-28 13:53:01

标签: ruby-on-rails ruby activeadmin arel ransack

Project::Contribution belongs_to User User has_one User::Profile

first_namelast_nameUser::Profile

中包含的字段

我想创建一个搜索器,允许我使用其用户个人资料first_namelast_name过滤我的贡献。

如何实现这一目标?

这是我到目前为止所尝试的:

# admin/contribution.rb
filter :user_full_name_cont

# models/user.rb
ransacker :full_name do |parent|
  Arel::Nodes::InfixOperation.new('||', parent.table[:profile_first_name], parent.table[:profile_last_name]) # error
end

由于:parent.table[:profile_first_name]parent.table[:profile_last_name]而失败,因为我无法像这样访问profile表。

1 个答案:

答案 0 :(得分:1)

终于找到了解决方案:

# models/user/profile.rb
  ransacker :full_name, formatter: proc { |v| v.mb_chars.downcase.to_s } do |parent|
    Arel::Nodes::NamedFunction.new('LOWER',
     [Arel::Nodes::NamedFunction.new('concat_ws',
      [Arel::Nodes.build_quoted(' '), parent.table[:first_name], parent.table[:last_name]])])
  end

# admin/user.rb
filter :user_profile_full_name_cont