gpt4 book ai didi

sql - rails : saving filter conditions on attributes and checking whether conditions pass?

转载 作者:数据小太阳 更新时间:2023-10-29 08:03:59 26 4
gpt4 key购买 nike

我有一个 SaaS 应用程序,其中一个帐户有很多用户。

在帐户中,帐户所有者可以对申请成为帐户一部分的用户指定某些过滤器。例如,他可以设置必须满足这些要求条件才能让用户被接受:user.age > 21,user.name.count > 4。

我正在考虑创建一个属于 Account 的 FilterCondition 模型,其中一行可能看起来像 account_id: 1, attribute: "age", condition_string: "> 21" account_id:1,属性:“phone_type”,condition_string:“== iphone”

然后当我只想接受满足这些条件的用户时,做类似的事情

  #User.rb
def passes_requirements?
account.filter_conditions.each do |filter_conditions|
attr = filter_condition.attribute
return false if self.attr != filter_condition.condition
end
true
end

我知道这是完全错误的语法,但它应该让我明白我想做什么。

有什么建议的方法可以让帐户保存要求条件,然后检查用户是否满足这些要求?

最佳答案

如果将条件字符串分成比较器(例如>)和要比较的值会更容易:

class FilterCondition < ActiveRecord::Base
belongs_to :account

validates :attribute, presence: true
validates :comparator, presence: true
validates :value, presence: true

def matching_users(query_chain = User.where(account: account))
query_chain.where("#{attribute} #{safe_comparator} ?", value)
end

private
def safe_comparator
safe_values = ['=', '>', '>=', '<', '<='] # etc
return comparator if safe_values.include? comparator
''
end
end

safe_comparator 方法降低了 SQL 注入(inject)查询的风险。链接一组过滤器有点棘手,但像下面这样的想法应该可行。

class Account < ActiveRecord::Base
#....
has_many :filter_conditions
def filtered_users
query = User.where(account: self)
filter_conditions.each do |filter_condition|
query = filter_condition.matching_users(query)
end
query
end

end


account = Account.first

filter_1 = FilterCondition.create(
account: account,
attribute: :age,
comparator: '>=',
value: 21
)
filter_2 = FilterCondition.create(
account: account,
attribute: :age,
comparator: '<=',
value: 99
)


account.filtered_users

关于sql - rails : saving filter conditions on attributes and checking whether conditions pass?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26050063/

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