6

我正在尝试按 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 = Item.where('company_id = ? and approved = ?', @company.id, true).all

我需要按相关表中的“位置”列进行排序。问题在于,在优先级模型中,一个项目可能会为多家公司列出。所以职位取决于他们拥有的 company_id。当我展示这些项目时,它是针对一家公司的,按公司内的职位排序。实现此目的的正确方法是什么?任何帮助表示赞赏。

PS - 我知道acts_as_list 但是发现它不太适合我在这里的设置,所以我手动处理保存排序,同时仍然使用jquery ui sortable。

4

2 回答 2

9

您可以使用该includes方法包含构建关联,然后按它排序。您只需确保消除了您订购的字段的歧义,并且在急切加载时您应该在此处阅读一些内容。所以它可能是这样的:

@items = Item.includes(:priorities).where('company_id = ? and approved = ?', @company.id, true).order("priorities.position ASC")
于 2013-06-28T15:20:52.393 回答
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

于 2013-06-28T15:12:36.330 回答