You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用ActiveRecord与PostgreSQL存储含AND/OR的用户自定义逻辑

实现支持AND/OR逻辑的规则存储方案(ActiveRecord + PostgreSQL)

针对需要存储多规则间AND/OR逻辑关系的需求,这里提供两种实用的实现方案,适配不同业务场景:


方案一:嵌套分组关系表(关系型规范方案)

通过新增关联表实现规则的分组与逻辑嵌套,适合需要严格数据约束、频繁通过SQL查询规则的场景。

表结构设计

  1. 新增fulfillment_rule_groups表:存储规则组的逻辑类型和层级关系

    字段名类型说明
    idbigint主键
    logic_typevarchar(10)逻辑类型,仅允许AND/OR
    parent_group_idbigint父组ID,支持嵌套逻辑
    created_attimestamp创建时间
    updated_attimestamp更新时间
  2. 新增fulfillment_rule_group_items表:关联规则组与具体规则/子组(多态关联)

    字段名类型说明
    idbigint主键
    group_idbigint所属规则组ID
    item_typevarchar(50)关联对象类型(规则/子组)
    item_idbigint关联对象ID
    created_attimestamp创建时间
    updated_attimestamp更新时间
  3. 原fulfillment_rules表保持不变,新增与组的关联

ActiveRecord模型实现

# 规则组模型
class FulfillmentRuleGroup < ApplicationRecord
  LOGIC_TYPES = %w[AND OR].freeze
  validates :logic_type, inclusion: { in: LOGIC_TYPES }

  belongs_to :parent_group, class_name: "FulfillmentRuleGroup", optional: true
  has_many :child_groups, class_name: "FulfillmentRuleGroup", foreign_key: "parent_group_id"
  has_many :group_items, class_name: "FulfillmentRuleGroupItem"
  has_many :rules, through: :group_items, source: :item, source_type: "FulfillmentRule"
end

# 组与规则/子组的关联模型
class FulfillmentRuleGroupItem < ApplicationRecord
  belongs_to :group, class_name: "FulfillmentRuleGroup"
  belongs_to :item, polymorphic: true
end

# 原规则模型新增关联
class FulfillmentRule < ApplicationRecord
  has_many :group_items, class_name: "FulfillmentRuleGroupItem", as: :item
end

使用示例

要存储(产品颜色=blue AND 产品尺寸=large) OR 产品价格>100的逻辑:

  1. 创建顶层OR规则组
  2. 向该组添加两个子项:
    • 一个AND规则组,关联“颜色=blue”和“尺寸=large”两条规则
    • 一条“价格>100”的单独规则

优缺点

  • ✅ 符合关系型数据库设计规范,数据约束强
  • ✅ 支持无限层级的嵌套逻辑
  • ❌ 结构相对复杂,查询嵌套逻辑需用PostgreSQL递归CTE

方案二:JSONB存储逻辑表达式(快速实现方案)

利用PostgreSQL的JSONB类型直接存储结构化的逻辑表达式,适合逻辑灵活、快速迭代的场景。

表结构设计

新增fulfillment_rule_sets表(或修改原表新增字段):

字段名类型说明
idbigint主键
expressionjsonb存储逻辑表达式的JSON结构
created_attimestamp创建时间
updated_attimestamp更新时间

逻辑表达式结构示例

{
  "logic": "OR",
  "conditions": [
    {
      "logic": "AND",
      "conditions": [
        {"order_element": "product", "element_detail": "color", "is_equal_to": "blue"},
        {"order_element": "product", "element_detail": "size", "is_equal_to": "large"}
      ]
    },
    {"order_element": "product", "element_detail": "price", "is_greater_than": 100}
  ]
}

ActiveRecord模型实现

class FulfillmentRuleSet < ApplicationRecord
  validates :expression, presence: true

  # 可选:自定义验证确保表达式结构合法
  validate :validate_expression_structure

  private

  def validate_expression_structure
    return unless expression.present?

    unless expression.key?("logic") && %w[AND OR].include?(expression["logic"])
      errors.add(:expression, "必须包含合法的logic字段(AND/OR)")
    end

    unless expression.key?("conditions") && expression["conditions"].is_a?(Array)
      errors.add(:expression, "必须包含conditions数组")
    end
  end
end

查询示例

查找包含“产品颜色=blue”的规则集:

FulfillmentRuleSet.where("expression @> ?", { conditions: [{ order_element: "product", element_detail: "color", is_equal_to: "blue" }] }.to_json)

优缺点

  • ✅ 实现简单,无需复杂的关联表设计
  • ✅ 支持任意嵌套逻辑,结构灵活
  • ❌ 复杂查询性能不如关系型结构,数据库层面约束较弱,需依赖应用层验证

内容的提问来源于stack exchange,提问作者ToddT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 10:55:38