通过关系在 has_many 中包含额外的行
Include extra rows in a has_many through relation
我不确定解决这个问题的最佳方法是什么。
我有一个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
在查询中包含其他农场的最佳方式是什么?
您可以将以下方法添加到您的用户模型中:
def animals_with_extra_farms(farm_ids = [])
farm_ids += farms.map(&:id)
Animal.where(farm_id: farm_ids)
end
并不是说这会导致 2 个数据库查询。从性能的角度来看,还有其他解决方案可能更好,但此解决方案非常简单易懂。在我看来,简单的代码可以抵得上几毫秒的性能。
如果发现这是一个瓶颈,您以后可以随时重构它。
我不确定解决这个问题的最佳方法是什么。
我有一个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
在查询中包含其他农场的最佳方式是什么?
您可以将以下方法添加到您的用户模型中:
def animals_with_extra_farms(farm_ids = [])
farm_ids += farms.map(&:id)
Animal.where(farm_id: farm_ids)
end
并不是说这会导致 2 个数据库查询。从性能的角度来看,还有其他解决方案可能更好,但此解决方案非常简单易懂。在我看来,简单的代码可以抵得上几毫秒的性能。
如果发现这是一个瓶颈,您以后可以随时重构它。