我试图通过Rails中相关模型中的字段进行排序。如果相关模型被另一个参数过滤,我研究过的所有解决方案都没有解决?
项目模型
class Item < ActiveRecord::Base
has_many :priorities
相关型号:
class Priority < ActiveRecord::Base
belongs_to :item
validates :item_id, presence: true
validates :company_id, presence: true
validates :position, presence: true
end
我正在使用where子句检索Items:
@items = Item.where('company_id = ? and approved = ?', @company.id, true).all
我需要通过相关表格中的“位置”列进行排序。问题在于,在优先级模型中,可以列出多个公司的项目。所以这些职位取决于他们拥有哪家公司。当我显示项目时,它是针对一家公司,按公司内部的位置排序。完成此任务的正确方法是什么?任何帮助表示赞赏。
PS - 我知道acts_as_list然而发现它不太适合我的设置,所以我手动处理保存排序,同时仍然使用jquery ui sortable。
答案 0 :(得分:9)
您可以使用includes
方法包含构建关联,然后按顺序排序。您只需确保消除所订购字段的歧义,并且在here的热切加载中应该阅读一些内容。所以它可能是这样的:
@items = Item.includes(:priorities).where('company_id = ? and approved = ?', @company.id, true).order("priorities.position ASC")
答案 1 :(得分:1)
class Item < ActiveRecord::Base
has_many :priorities
belongs_to :company
def self.approved
where(approved: true)
end
end
class Priority < ActiveRecord::Base
belongs_to :item
end
class Company < ActiveRecord::Base
has_many :items
end
@company = Company.find(params[:company_id])
@items = @company.items.joins(:priorities).approved.order(priorities: :position)
如果我理解了你的问题,我就是这样做的。它并不需要太多解释,但是如果你不确定的话就知道。
如果您想将更多内容推送到模型中,如果这是一个常见的要求,您可以调整订单的范围:
class Item < ActiveRecord::Base
has_many :priorities
belongs_to :company
def self.approved
where(approved: true)
end
def self.order_by_priority_position
joins(:priorities).order(priorities: :position)
end
end
并使用:@company.items.approved.order_by_priority_position