返回另一个模型会导致ActiveRecord查询

时间:2016-11-28 23:55:13

标签: ruby-on-rails activerecord

说我在两个表之间有一个简单的一对多关系

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;。这个问题的上下文超出了问题的范围,但是当一个模型映射到许多其他模型类型时,我在查询多态关联时遇到了它的需要。

4 个答案:

答案 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对象。哪个很奇怪,但是由于鸭式输入而有效。