如何在 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