所以我有以下简化的模型和关联:
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没有在文档中找到任何内容,但是那时又有很多东西被遗漏了。
答案 0 :(得分:1)
Doug就我理解您的代码而言,BarberStyle
必须是Barber
和Style
之间的加入模型。您在评论中提到,您从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中仅存储了 的额外信息,请告诉我。