Rails 5:包括用于多态的条件

时间:2017-09-21 15:05:53

标签: ruby-on-rails activerecord ruby-on-rails-5 polymorphic-associations

我需要查询我的模型并生成类似于此的记录:

[{
  "subscriber": {
    "email": "user@example.com",
    "subscriptions": [{
      "confirmed": true,
      "subscriptionable": {
        "name": "Place XYZ",
        "comments": [{
          "author": "John",
          "body": "Hello."
        }]
      }
    }]
  }
}]

我的模特看起来像这样:

class Subscriber < ApplicationRecord
  has_many :subscriptions
end

class Subscription < ApplicationRecord
  belongs_to :subscriptionable, polymorphic: true
  belongs_to :subscriber
end

class Place < ApplicationRecord
  has_many :subscriptions, as: :subscriptionable
  has_many :comments, as: :commentable
end

class Comment < ApplicationRecord
  belongs_to :commentable, polymorphic: true
end

到目前为止,我可以通过运行此查询来生成我想要的记录:

Subscriber.includes(subscriptions: [subscriptionable: [:comments]])

问题是我,通过上面的查询,我无法指定任何条件。例如,这将失败:

Subscriber.includes(subscriptions: [subscriptionable: [:comments]])
    .where(subscriptions: { confirmed: true })

> ActiveRecord::EagerLoadPolymorphicError: Cannot eagerly load the polymorphic association :subscriptionable

另一个问题是我无法获得某些属性,例如:

Subscriber.includes(subscriptions: [subscriptionable: [:comments]])
    .pluck("subscribers.email")

> ActiveRecord::EagerLoadPolymorphicError: Cannot eagerly load the polymorphic association :subscriptionable

修改

也许这有助于澄清:我想要实现的是这个SQL查询的内容:

SELECT subscriptions.name as sub_name, subscriptions.email as sub_email, 
       places.name as place_name, comments.author as com_author, comments.body as com_body, subscribers.token
FROM subscriptions 
JOIN subscribers
ON subscriptions.subscriber_id = subscribers.id
JOIN places 
ON subscriptionable_id = places.id 
JOIN comments 
ON places.id = commentable_id 
WHERE subscriptions.confirmed 
AND subscriptionable_type = 'Place' 
AND commentable_type = 'Place' 
AND comments.status = 1 
AND comments.updated_at >= '#{1.week.ago}'

0 个答案:

没有答案