0

我有以下型号:

class User < ActiveRecord::Base
  has_many :subscriptions, as: :subscribable
  has_many :user_to_high_school_subscriptions
  has_many :high_school_subscriptions, through: :user_to_high_school_subscriptions

  def all_subscriptions
    self.subscriptions + self.high_school_subscriptions.subscriptions
  end
end

class UserToHighSchoolSubscription < ActiveRecord::Base
  belongs_to :user
  belongs_to :high_school_subscription
end

class HighSchoolSubscription < ActiveRecord::Base
  has_many :user_to_high_school_subscriptions
  has_many :users, through: :user_to_high_school_subscriptions
  has_many :subscriptions, as: :subscribable
end

class Subscription < ActiveRecord::Base
  belongs_to :subscribable, polymorphic: true
end

有没有一个聪明的方法让我得到所有Subscription的 a User

我试过了

u = User.first
subs = u.all_subscriptions

但这是错误的(undefined method subscriptions' for #<ActiveRecord::Relation:)。我认为当我尝试使用has_many :subscriptionson the时会感到窒息,HighSchoolSubscription因为 a user has_many :high_school_subscriptions. (这一行:)self.high_school_subscriptions.subscriptions

有没有办法在 Rails 中的 has_many 上聚合 has_many?

运行轨道 3.2.1

4

1 回答 1

1

self.subscriptions不返回Array但是ActiveRecord::Relation。这就是为什么这些+方法不起作用并且你得到提到的错误的原因。最简单的解决方法是这样做:

def all_subscriptions
  self.subscriptions.all + self.high_school_subscriptions.all.collect { |hss| hss.subscriptions.all }.flatten
end

all方法将触发数据库查询并返回一个数组。因为一个用户可能有很多高中订阅,而这些也可能有很多订阅,所以您必须遍历所有高中订阅并收集他们的订阅。如您所见,这完全是矫枉过正。

重新设计您的数据模型或以不同的方式进行。

也许,确定Subscription模型的范围可能是一种方式。添加一个属性来指定它是哪种订阅,然后您可以完全删除该HighSchoolSubscription模型。

于 2012-10-25T20:57:36.637 回答