Ransacker 和 Arel 在协会领域
Ransacker and Arel on associations fields
我有 Project::Contribution
belongs_to
User
,并且
User
has_one
User::Profile
.
first_name
和 last_name
是包含在 User::Profile
中的字段
我想创建一个掠夺者,允许我使用他们的用户个人资料 first_name
和 last_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
table。
终于找到解决办法了:
# 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
我有 Project::Contribution
belongs_to
User
,并且
User
has_one
User::Profile
.
first_name
和 last_name
是包含在 User::Profile
我想创建一个掠夺者,允许我使用他们的用户个人资料 first_name
和 last_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
table。
终于找到解决办法了:
# 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