给定下表:
users
organizations
accounts
owner_id
owner_type
profiles
如果帐户可以由用户或组织拥有,并且每个帐户只有一个配置文件,是否可以在 Rails 中的配置文件中执行 STI 而无需“类型”字段?IE,我可以拥有根据所有权链加载的 OrganizationProfile 和 UserProfile 类,还是我需要在配置文件上有一个冗余的“类型”字段?
给定下表:
users
organizations
accounts
owner_id
owner_type
profiles
如果帐户可以由用户或组织拥有,并且每个帐户只有一个配置文件,是否可以在 Rails 中的配置文件中执行 STI 而无需“类型”字段?IE,我可以拥有根据所有权链加载的 OrganizationProfile 和 UserProfile 类,还是我需要在配置文件上有一个冗余的“类型”字段?
这不是一个答案,因为它没有经过测试,但我想尝试并且我需要格式化。
对于您的代码,我认为在以下两个范围内更有意义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 在那里接收哈希。
With STI, all records exist in the same table which inherit from the 'parent' class, in your case, Profile.
Rails uses the type field to determine what the type of a class is when deserializing, so there isn't really a way around having that on the profiles table.