Ruby on rails Rails中可重写设置的建模
我正试图找出建模的最佳方法,但还没有找到多少有用的方法 我的应用程序有一种报告层次结构。用户是作为帐户一部分的组织的一部分 我正试图找出正确的方法来模拟“设置”。因此,给定的帐户可以为该帐户下的所有帐户设置默认值。可以在组织级别覆盖这些默认值,用户可以进一步覆盖它们 到目前为止,我通过将每个记录映射到相应的父记录(用户、帐户、组织)来处理这个问题,但是在查询中,要将它们全部组合起来并获得最终的最终设置列表,需要做大量的工作 关于如何正确处理这个问题,您有什么想法吗?我的主要想法:Ruby on rails Rails中可重写设置的建模,ruby-on-rails,activerecord,data-modeling,Ruby On Rails,Activerecord,Data Modeling,我正试图找出建模的最佳方法,但还没有找到多少有用的方法 我的应用程序有一种报告层次结构。用户是作为帐户一部分的组织的一部分 我正试图找出正确的方法来模拟“设置”。因此,给定的帐户可以为该帐户下的所有帐户设置默认值。可以在组织级别覆盖这些默认值,用户可以进一步覆盖它们 到目前为止,我通过将每个记录映射到相应的父记录(用户、帐户、组织)来处理这个问题,但是在查询中,要将它们全部组合起来并获得最终的最终设置列表,需要做大量的工作 关于如何正确处理这个问题,您有什么想法吗?我的主要想法: 根据Ruby
- 根据Ruby的
散列将设置表示为树
- 使用类似JSON的DB类型存储设置(
作为PostgreSQL示例)jsonb
- 使用活动支持的
覆盖设置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
@JoshReedSchrammjsonb
很好。它的快速“可索引”有很多内置操作符。我主要在两种情况下使用它: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)