Rails所有权链和STI

时间:2013-09-05 19:51:41

标签: ruby-on-rails activerecord sti

鉴于以下表格:

users
organizations
accounts
  owner_id
  owner_type
profiles

如果帐户可以由用户或组织拥有,并且每个帐户只有一个配置文件,是否可以在配置文件的Rails中执行STI而无需“类型”字段? IE,我可以拥有基于所有权链加载的OrganizationProfile和UserProfile类,还是我需要在配置文件上有一个冗余的“类型”字段?

2 个答案:

答案 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表上没有真正的方法。