我在has_many
和Subscription
之间有一个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方法?
答案 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
集合。