鉴于以下表格:
users
organizations
accounts
owner_id
owner_type
profiles
如果帐户可以由用户或组织拥有,并且每个帐户只有一个配置文件,是否可以在配置文件的Rails中执行STI而无需“类型”字段? IE,我可以拥有基于所有权链加载的OrganizationProfile和UserProfile类,还是我需要在配置文件上有一个冗余的“类型”字段?
答案 0 :(得分:0)
这不是答案,因为它没有经过测试,但我想尝试,我需要格式化。
对于您的代码,我在Profile
中有两个范围更有意义:
belongs_to :account
scope :user, joins(:account).where(account: {owner_type: :User} )
scope :organization, joins(:account).where(account: {owner_type: :Organization} )
如果你还想要其他课程,你可以这样做:
class UserProfile
self.table_name = 'profiles'
default_scope joins(:account).where(account: {owner_type: :User} )
以及组织简介。
如果联接不是那样的,请尝试:
joins(:account).where('accounts.owner_type = User')
或
joins(:account).where(accounts: {owner_type: :User} )
我不确定ActiveRecord是否在那里收到哈希。
答案 1 :(得分:0)
使用STI,所有记录都存在于同一个表中,该表继承自“父”类,在您的情况下为Profile
。
Rails使用type
字段来确定反序列化时类的类型,因此在profiles
表上没有真正的方法。