所以我一直在努力订购:
Class Gigenrollment < ActiveRecord::Base
has_many :gigenrollments, dependent: :destroy
Class Gigenrollment < ActiveRecord::Base
belongs_to :gig
belongs_to :profile
def self.order_by_instrument
includes(profile: :instruments).order(profiles: {instruments: {primary: :desc}})
end
Class Profile < ActiveRecord::Base
has_many: :gigenrollments, dependent: :destroy
has_many :instruments, -> {order(primary: :desc)}, dependent: :destroy
Class Instrument < ActiveRecord::Base
belongs_to :profile
我有一种获得正确顺序的方法,但它有点难看。在控制器中看起来像这样:
# @gig is an instance of the Gig class, eg. Gig.last
@orchestra = @gig.gigenrollments
@orchestra = @orchestra.sort_by{ |ge| ge.profile.instruments.find_by(primary: true).nil? ? 'z' : ge.profile.instruments.find_by(primary: true).name}
因此,我试图找出一种更简洁的方式来根据一个配置文件主要工具名称(一个配置文件应该没有或更多)从一个工具中订购gig注册。到目前为止,我认为我的包含正确,但我找不到像我这样具有嵌套属性的订单示例。
到目前为止,我已经在我的控制器中完成了这项工作,希望得到我想要的东西:
@orchestra = @gig.gigenrollments
@orchestra = @orchestra.order_by_instrument # check out the order_by_instrument function in the code snippet in gigenrollment.rb
但我得到的错误是
Direction should be :asc or :desc
这让我觉得我无法正确理解语法。我也试过这个没有成功
# gigenrollment.rb
def self.order_by_instrument
includes(profile: :instruments).references(profile: :instruments).order('"profile"."instruments"."primary" ASC, "profile"."instruments"."name" ASC')
end
我一直在阅读this about includes和this about order以及有关Stackoverflow上此主题的几篇帖子,但它们似乎只有一个级别的嵌套属性(我有两个,gigenrollments - &gt; profile - &gt; instruments),他们正在使用范围,有表格,或者他们有一个where子句而不是order,这并没有真正让我到达我想要的地方(语法错误)。我还在Github上发现了一些让我觉得它应该可行的问题。
但是我得到的结论是,由于一个配置文件可以有很多乐器,而且只有属性为'primary'的乐器应该影响gigenrollments的排序,所以这对订单是不可行的,而我是写这个问题。
显然我需要声望才能发布链接,所以我在这里找到它们......
stackoverflow页面:
stackoverflow.com/questions/23121975/how-can-i-order-nested-includes-records-with-rails-4
stackoverflow.com/questions/19865208/rails-query-join-order-by-group-by-issue
stackoverflow.com/questions/13619560/rails-y-way-to-query-a-model-with-a-belongs-to-association
Github问题:
github.com/rails/rails/issues/8663
github.com/rails/rails/issues/726