如何使用活动记录方法获取关联的集合(代理集合)

时间:2014-10-08 11:17:14

标签: ruby-on-rails-4 rails-activerecord

我在has_manySubscription之间有一个Article关系,一篇文章有​​Product

class Subscription < ActiveRecord::Base
  has_many :articles
end

class Article < ActiveRecord::Base
  belongs_to :subscription
  belongs_to :product
end

class Product < ActiveRecord::Base
  has_many :subscriptions
end

现在。我想简单地从订阅中获取所有产品。

解决方案includes

class Subscription < ActiveRecord::Base
  has_many :articles
  def products
    articles.includes(:product).map{|a| ap.product} # Or .map(&:product)
  end
end

解决方案has_many :through

class Subscription < ActiveRecord::Base
  has_many :articles
  has_many :products, through: articles
end

第一个缺点是它不会返回可以链接的集合(例如subscription.products.pluck(:id)),而是一个简单的数组。

第二个并不完全'语义'正确:我不希望它成为一个完整的关联,而只是一个帮助来获取列表。

我是否只是忽略了一些允许我获取相关项目的activerecord方法?

1 个答案:

答案 0 :(得分:2)

我通常会把它写成&#34; has_many通过&#34;所以返回的products将表现得像一个关系。要在Subscription方法中实现类似功能,您可以将缺少的has_many关联添加到Product并合并Product联接中的订阅文章:

class Product < ActiveRecord::Base
  has_many :articles
end

class Subscription < ActiveRecord::Base
  has_many :articles

  def products
    Product.joins(:articles).merge(articles)
  end
end

在这种情况下,Subscription#products将返回ActiveRecord集合。