Ruby on rails Rails中可重写设置的建模

Ruby on rails Rails中可重写设置的建模,ruby-on-rails,activerecord,data-modeling,Ruby On Rails,Activerecord,Data Modeling,我正试图找出建模的最佳方法,但还没有找到多少有用的方法 我的应用程序有一种报告层次结构。用户是作为帐户一部分的组织的一部分 我正试图找出正确的方法来模拟“设置”。因此,给定的帐户可以为该帐户下的所有帐户设置默认值。可以在组织级别覆盖这些默认值,用户可以进一步覆盖它们 到目前为止,我通过将每个记录映射到相应的父记录(用户、帐户、组织)来处理这个问题,但是在查询中,要将它们全部组合起来并获得最终的最终设置列表,需要做大量的工作 关于如何正确处理这个问题,您有什么想法吗?我的主要想法: 根据Ruby

我正试图找出建模的最佳方法,但还没有找到多少有用的方法

我的应用程序有一种报告层次结构。用户是作为帐户一部分的组织的一部分

我正试图找出正确的方法来模拟“设置”。因此,给定的帐户可以为该帐户下的所有帐户设置默认值。可以在组织级别覆盖这些默认值,用户可以进一步覆盖它们

到目前为止,我通过将每个记录映射到相应的父记录(用户、帐户、组织)来处理这个问题,但是在查询中,要将它们全部组合起来并获得最终的最终设置列表,需要做大量的工作

关于如何正确处理这个问题,您有什么想法吗?

我的主要想法:

  • 根据Ruby的
    散列将设置表示为树
  • 使用类似JSON的DB类型存储设置(
    jsonb
    作为PostgreSQL示例)
  • 使用活动支持的
    Hash#deep_merge
    覆盖设置
例如:

class User < ApplicationRecord
  belongs_to :organization
  # settings | jsonb | not null default '{}'::jsonb
  # ...

class Organization < ApplicationRecord
  belongs_to :account
  # settings | jsonb | not null default '{}'::jsonb
  # ...

class Account < ApplicationRecord
  # settings | jsonb | not null default '{}'::jsonb
  # ...

它需要一个快速的DB查询(
deep\u merge
@JoshReedSchramm
jsonb
很好。它的快速“可索引”有很多内置操作符。我主要在两种情况下使用它:1)我的前端想要存储一些JSON状态,2)通过敏捷,我不知道在不久的将来需要添加多少配置列。
class Settings
  cattr_reader :global_settings do
    # hash = ... read global settings somehow
    hash.freeze # prevent global settings from changes
  end

  def self.settings_for(user_id)
    User
      .joins(organization: :account)
      .where(id: user_id)
      .limit(1)
      .pluck(*%w[ accounts.settings organizations.settings users.settings ])
      .first
      .reduce(global_settings){ |memo, e| memo.deep_merge(e) }
      # or
      # .each_with_object(global_settings.dup){ |e, memo| memo.deep_merge!(e) }
  end
  # ...

Settings.settings_for(111)