说我在两个表之间有一个简单的一对多关系
class Table < ActiveRecord:Base
has_may :legs
end
class Leg < ActiveRecord:Base
belongs_to :table
end
当我运行以下查询时,它会返回Table
模型对象的列表。
Table.joins(:legs).where("legs.type = 'short'")
# => [<Table id: 1>, <Table id: 1>]
由于Table
可以有多个legs
符合上述查询条件,因此我的结果中有时会收到重复的Table
个实例。
能够在Table
上查询但是返回Leg
个对象的结果集
Table.joins(:legs).where("legs.type = 'short'")
# => [<Leg id: 1>, <Leg id: 2>]
这可能吗?
谢谢!
编辑:要清楚,我知道我可以通过map
每个对象来获得我想要的结果。但是这与一对多的关系变得棘手。所以我正在寻找更多的本地人#34; ActiveRecord的方式来做到这一点
编辑2:我也知道我可以直接在Leg
查询 - 这不是问题。问题的核心是#34;是否可以在Table
上查询但返回Leg
个对象的列表?&#34;。这个问题的上下文超出了问题的范围,但是当一个模型映射到许多其他模型类型时,我在查询多态关联时遇到了它的需要。
答案 0 :(得分:0)
我想你只想要:
Leg.where(type: 'short')
。
答案 1 :(得分:0)
您可以在Table
模型上编写一个类方法
def self.short_legs
Leg.where(type: 'short')
end
然后将其称为Table.short_legs
答案 2 :(得分:0)
这是一个怪异的解决方法,但是您可以执行以下操作:
Leg.find_by_sql(Table.joins(:legs).where("legs.type = 'short'").select("DISTINCT legs.*").to_sql)
它将核心查询转换为原始sql,然后在支腿模型上运行该原始sql。只要得到结果,就可以查询模型的所有领域。
答案 3 :(得分:0)
Table.joins(:legs)
.where(legs: { type: 'short' })
.select('DISTINCT legs.*')
这将使用Leg的所有字段实例化一个Table对象。哪个很奇怪,但是由于鸭式输入而有效。