Rails聚合多态has_many关系

时间:2013-08-22 03:26:57

标签: ruby-on-rails polymorphic-associations

在我的应用中,AccountHousehold可以拥有User。用户可以访问他们拥有的帐户以及他们家庭拥有的帐户。我已经定义了accessible_accounts,这给了我一个家庭和用户帐户的数组,但有没有办法获得与关系相同的结果,所以我可以用更多的条件链接它?订单不重要(实际上可以通过进一步链接设置)

class User < ActiveRecord::Base
  has_many :accounts, as: :owner

  belongs_to :household

  def accessible_accounts
    ua = accounts.to_a
    ha = []
    if household
      ha = household.accounts.to_a
    end
    (ua + ha).uniq
  end
end

class Household < ActiveRecord::Base
  has_many :users
  has_many :accounts, as: :owner
end

class Account < ActiveRecord::Base
  belongs_to :owner, polymorphic: true
end

2 个答案:

答案 0 :(得分:1)

我对此有几点想法:

首先,您可以通过将以下内容添加到Account模型来表达User通过Household所拥有的Accounts

has_many :accounts, through: household

但是,我知道您希望Relation代表用户通过其关联家庭拥有的帐户直接拥有的帐户的合并/联合。如果这是真的,那么我认为添加到User的以下方法将为您提供所需内容:

def accessible_accounts
  Account.where(
    '(ownable_id = ? and ownable_type = ?) or (ownable_id = ? and ownable_type = ?)',
    id, User.to_s, household_id, Household.to_s)
end

我没有对此进行测试,但我认为如果我误解了某些内容,我会继续分享并依靠反馈。

答案 1 :(得分:0)

在一个适当的多态关联中,我认为你的结构如下:

class User < ActiveRecord::Base
  belongs_to :household
  has_many :accounts, as: :ownable
end

class Household < ActiveRecord::Base
  has_many :users
  has_many :accounts, as: :ownable
end

class Account < ActiveRecord::Base
  belongs_to :ownable, polymorphic: true
end

顺便说一句,你有没有使用Devise和CanCan进行身份验证的特殊原因吗?授权?