gpt4 book ai didi

ruby-on-rails - Rails Active Admin - 如何仅过滤符合集合中所有选中项的记录

转载 作者:行者123 更新时间:2023-12-03 22:40:06 26 4
gpt4 key购买 nike

我有一个用户到网络模型的一对多关联。我的架构信息的相关部分如下。

# == Schema Information      
# Table name: users
#
# id :integer not null, primary key
# name :string(255)

#
# Table name: networks
#
# id :integer not null, primary key
# user_id :integer
# uid :string(255)
# name :string(255)
# pub_url :string(255)

我想使用网络模型的 name 属性过滤掉具有特定多个网络的用户。例如,如果我检查 facebook 和foursquare 作为过滤器,我想找回同时连接facebook 和foursquare 的用户。我当前的实现是传递一个包含用户可以添加的网络名称的数组,如下所示。
filter :networks_name, :as => :check_boxes,
:collection => %w(facebook twitter foursquare linkedin)

然而,这对过滤器使用 OR 条件,该过滤器检索具有任何选中项目的用户。我真正想要的是满足所有检查项目的用户。
实现这一目标的正确方法是什么?

最佳答案

ActiveAdmin 使用 meta_search 作为其过滤器 ( https://github.com/ernie/meta_search ):

filter :networks_name_all,
:as => :check_boxes,
:collection => %w(facebook twitter foursquare linkedin)

在您的用户模型中:
scope :networks_names_all_in, -> names {
names.reduce(scoped) do |scope, name|
subquery = User.select('`users`.`id`').
joins(:networks).
where('networks.name = ?', name)
scope.where("`users`.`id` IN (#{subquery.to_sql})")
end
}
search_methods :networks_name_all_in

这将为您创建一个很好的单个 SQL 查询,具有适当的连接和 where 条件。

例如:
User.networks_name_all_in(["facebook", "twitter"])

将生成以下 SQL 请求:
SELECT *
FROM `users`
WHERE `users`.`id` IN (SELECT `users`.`id`
FROM `users`
INNER JOIN `networks`
ON `networks`.`user_id` = `users`.`id`
WHERE `networks`.`name` = 'facebook')
AND `users`.`id` IN (SELECT `users`.`id`
FROM `users`
INNER JOIN `networks`
ON `networks`.`user_id` = `users`.`id`
WHERE `networks`.`name` = 'twitter')

更新:添加了功能范围。

更新 2:使范围对范围合并问题具有弹性。

关于ruby-on-rails - Rails Active Admin - 如何仅过滤符合集合中所有选中项的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13251559/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com