在has_many中通过关系包含额外的行

时间:2015-03-22 01:51:44

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

我不确定解决这个问题的最佳方法是什么。

我有一个关于has_many的关系:

class User < ActiveRecord::Base

  has_many :animals,
           through: :farms

end

我的问题涉及想要添加一个额外的farm,其中包括动物,即使技术上用户不拥有该农场。

如果用户有10个农场,其中ID为1到10,那么我想要做的事情就是包括一个ID为15的农场。

所以通常会user.animals。我想做user.animals.include("farms.id = ?", 15)之类的事情,它可以在所有用户农场(1 - 10)中提供动物的结果,还包括15号农场的动物。

我将如何做到这一点?

最终我的查询看起来像user.animals.reorder(created_at: :desc).includes(:owner, :farm).page(5).per(30).to_a

在查询中包含其他服务器场的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

您可以将以下方法添加到您的用户模型中:

def animals_with_extra_farms(farm_ids = [])
  farm_ids += farms.map(&:id)
  Animal.where(farm_id: farm_ids)
end

这不会导致2次数据库查询。从性能的角度来看,还有其他解决方案可能更好,但这种解决方案非常直接且易于理解。在我看来,简单的代码可以值几毫秒的性能。

如果事实证明这是一个瓶颈,你可以随时重构它。