如何在 rails ruby 中 运行 这个表达式
How to run this expression in ruby on rails
我有两个模型
class Filters < ActiveRecord::Base
end
class Groups < ActiveRecord::Base
end
过滤器模型负责从数据库中获取用户数据,例如
filter_id_1。 SELECT users.* FROM users INNER JOIN notes ON notes.user_id = users.id WHERE notes.category = 'Emotions'
filter_id_2。 SELECT users.* FROM users INNER JOIN subscriptions ON subscriptions.user_id = users.id WHERE (Date(end_date) = CURDATE())
filter_id_3。 SELECT users.* FROM users WHERE (auth_token_created_at > DATE_SUB(NOW(), INTERVAL 2 hour))
组模型使一个组具有多个具有 AND 和 OR 条件的过滤器,例如
group_id_1 = "filter_id_1 AND filter_id_2 OR filter_id_3"
现在使用组,我试图通过根据 AND OR 条件将表达式转换为方法来获取用户。
users = Filter.find(1).get_users & Filter.find(2).get_users | Filter.find(3).get_users
我如何从这个 "filter_id_1 AND filter_id_2 OR filter_id_3"
转换这个表达式
至此
users = Filter.find(1).get_users & Filter.find(2).get_users | Filter.find(3).get_users
如果可以,您可能希望将小组格式转换为更结构化的格式,例如 [1, '&', 2, '|', 3]
,这样可以更轻松地应用。如果没有,我们可以通过一些简单的替换很快到达那里:
parts = 'filter_id_1 AND filter_id_2 OR filter_id_3'
.gsub('filter_id_', '')
.gsub('AND', '&')
.gsub('OR', '|')
.split
#=> ["1", "&", "2", "|", "3"]
然后您可以通过浏览符号来构建您的用户列表:
parts = ["1", "&", "2", "|", "3"]
users = Filter.find(parts.shift).get_users
while parts.any?
op = parts.shift
next_users = Filter.find(parts.shift).get_users
users = users.send(op, next_users)
end
只要 parts
中还剩下一些东西(并且假设该组格式正确),您就知道有一个操作后跟另一个过滤器 ID。抓住每一个,您可以将 op
发送到您现有的 users
,以正确的方式应用下一组用户。
我认为更好的解决方案是 在用户模型和查询方法中使用范围。
查询方法
在rails中,ActiveRecord 提供了很多查询方法来实现它,像这样:
User.joins(:notes).where(notes: {category: 'Emotions'})
这会产生:
SELECT users.* FROM users INNER JOIN notes ON notes.user_id = users.id WHERE notes.category = 'Emotions'
参考:http://guides.rubyonrails.org/active_record_querying.html
范围
#app/models/user.rb
class User
scope :group_by_note_category -> (category){
self.joins(:notes).where(notes: {category: category})
}
end
#use like this
User.group_by_note_category('Emotions')
您的目的是使用 'And' 和 'Or' 组合两个 Active:Relation 对象。希望这会有用。
参考:Combine two ActiveRecord::Relation objects
我有两个模型
class Filters < ActiveRecord::Base
end
class Groups < ActiveRecord::Base
end
过滤器模型负责从数据库中获取用户数据,例如
filter_id_1。 SELECT users.* FROM users INNER JOIN notes ON notes.user_id = users.id WHERE notes.category = 'Emotions'
filter_id_2。 SELECT users.* FROM users INNER JOIN subscriptions ON subscriptions.user_id = users.id WHERE (Date(end_date) = CURDATE())
filter_id_3。 SELECT users.* FROM users WHERE (auth_token_created_at > DATE_SUB(NOW(), INTERVAL 2 hour))
组模型使一个组具有多个具有 AND 和 OR 条件的过滤器,例如
group_id_1 = "filter_id_1 AND filter_id_2 OR filter_id_3"
现在使用组,我试图通过根据 AND OR 条件将表达式转换为方法来获取用户。
users = Filter.find(1).get_users & Filter.find(2).get_users | Filter.find(3).get_users
我如何从这个 "filter_id_1 AND filter_id_2 OR filter_id_3"
至此
users = Filter.find(1).get_users & Filter.find(2).get_users | Filter.find(3).get_users
如果可以,您可能希望将小组格式转换为更结构化的格式,例如 [1, '&', 2, '|', 3]
,这样可以更轻松地应用。如果没有,我们可以通过一些简单的替换很快到达那里:
parts = 'filter_id_1 AND filter_id_2 OR filter_id_3'
.gsub('filter_id_', '')
.gsub('AND', '&')
.gsub('OR', '|')
.split
#=> ["1", "&", "2", "|", "3"]
然后您可以通过浏览符号来构建您的用户列表:
parts = ["1", "&", "2", "|", "3"]
users = Filter.find(parts.shift).get_users
while parts.any?
op = parts.shift
next_users = Filter.find(parts.shift).get_users
users = users.send(op, next_users)
end
只要 parts
中还剩下一些东西(并且假设该组格式正确),您就知道有一个操作后跟另一个过滤器 ID。抓住每一个,您可以将 op
发送到您现有的 users
,以正确的方式应用下一组用户。
我认为更好的解决方案是 在用户模型和查询方法中使用范围。
查询方法
在rails中,ActiveRecord 提供了很多查询方法来实现它,像这样:
User.joins(:notes).where(notes: {category: 'Emotions'})
这会产生:
SELECT users.* FROM users INNER JOIN notes ON notes.user_id = users.id WHERE notes.category = 'Emotions'
参考:http://guides.rubyonrails.org/active_record_querying.html
范围
#app/models/user.rb
class User
scope :group_by_note_category -> (category){
self.joins(:notes).where(notes: {category: category})
}
end
#use like this
User.group_by_note_category('Emotions')
您的目的是使用 'And' 和 'Or' 组合两个 Active:Relation 对象。希望这会有用。
参考:Combine two ActiveRecord::Relation objects