Rails - 在ActiveRecord查询中处理返回的对象

时间:2017-05-14 18:34:29

标签: ruby-on-rails activerecord associations

所以我有以下简化的模型和关联:

class Barber < User
    has_many :barber_styles, inverse_of: :barber
end

class Style < ActiveRecord::Base
end

class BarberStyle < ActiveRecord::Base
    belongs_to :barber, inverse_of: :barber_styles
    belongs_to :style
    delegate :name, to: :style
end

如果我想根据属于特定BarberStyle的所有Barber进行查询,有没有办法可以包含相关{{1}的名称}?

我想使用类似的行:

Style

因此,我可以访问关联的BarberStyle.joins(:barber).where(barber: 109).include(:style) 。但我不认为存在这样的界限。

我知道我可以使用style.name来构建我自己的对象数组,但是我必须使用与许多不同模型类似的查询,并且不想做一堆额外的工作如果没有必要的话。

在我之前的一个项目中,我能够使用以下行渲染json:

map

但是我不想在这种情况下渲染json。

修改

我真的没有任何未包含的协会可以展示,但我会尝试进一步阐述。

我尝试做的就是在ActiveRecord Relation查询中为每个@colleges = College.includes(:sports).where(sports: { gender: "male" }) render json: @colleges, include: :sports 结果聚合额外的关联模型/字段。

为了减少这种麻烦,下面是一个我希望传递到JS视图的数据类型示例:

BarberStyle

我希望以这种方式格式化数据的原因是因为我无法在JS视图中对关联模型进行任何查询(没有对服务器进行AJAX调用)。

当我过去[ #<BarberStyle id: 1, barber_id: 116, style_id: 91, style: { name: "Cool Hairstyle" } >, #<BarberStyle id: 2, barber_id: 97, style_id: 92, style: { name: "Cooler Hairstyle" } >, etc... ] 时,我的数据格式非常相似。这为我提供了render json: @colleges, include: :sports的集合,其中包含与每个Colleges结果汇总的关联Sport模型。我不想以这种方式为我目前的情况建立json,因为它会使一些事情复杂化。但我认为这是最后的手段。

我不确定是否有一种构建ActiveRecord查询的方法,它会在结果中添加其他字段,但我觉得应该这样,所以我在这里寻找它。 Haven没有在文档中找到任何内容,但是那时又有很多东西被遗漏了。

2 个答案:

答案 0 :(得分:1)

Doug就我理解您的代码而言,BarberStyle必须是BarberStyle之间的加入模型。您在评论中提到,您从has_many :styles, through: :barber_styles模型中删除了Barber,因为您认为它不相关。事实并非如此,这正是帮助您实现目标的关键所在。再次添加此关系,然后您可以执行以下操作:

barber = Barber.includes(:styles).where(barber: {id: 109})
barber.styles.each { |style| puts style.name }

由于barber.styles是一个集合,我在所有可能的样式之间添加了一个循环。但是,从那时起,您可以按照自己的意愿使用数据,循环使用它或任何其他您想要的方式。

希望有所帮助!

答案 1 :(得分:0)

首先,在您的情况下,inverse_of无法完成任何操作,因为您正在设置默认值。删除它。

其次,您似乎需要更好地理解HABTM关系的概念。 使用has many through通常是一个好主意,因为您可以在中间向模型添加数据和逻辑。

它非常适合您的情况,所以您应该这样设置:

class Barber < User
  has_many :barber_styles
  has_many :styles, through: :barber_styles
end

class Style < ActiveRecord::Base
  has_many :barber_styles
  has_many :barbers, through: :barber_styles
end

class BarberStyle < ActiveRecord::Base
  belongs_to :barber
  belongs_to :style
end

现在,获取给定理发师的风格是一件容易的事。就这样做:

barber = Barber.find(1)
barber.styles
# => AR::Collection[<#Style name:'Cool Hairstyle'>,<#Style name:'Cooler Hairstyle'>]

Rails自动使用中间的BarberStyle模型来查找某个理发师的样式。 我认为这可以满足您的需求,如果您在BarberStyle中仅存储了 的额外信息,请告诉我。