在不访问数据库两次的情况下将排序范围添加到链中(Rails,ActiveRecord)
Add sorting scope to chain without hitting database twice (Rails, ActiveRecord)
我有一个链式范围查询,用于检查标记项目的标签并将它们从“可用”列表中删除。但是,此范围固定到“可见”范围:
scope :visible, -> { where("rfid_tags.location_id NOT IN (SELECT warehouses.id FROM warehouses WHERE warehouses.deleted_at IS NULL AND warehouses.hidden = 't') OR rfid_tags.location_type = 'Listing'") }
scope :available, -> { not_selected.visible.without_flags }
scope :without_flags, -> { joins("LEFT OUTER JOIN flags ON flags.rfid_tag_id = rfid_tags.id").where(flags: { id: nil })}
我正在尝试对可见标记进行排序,以便标记的项目位于列表的末尾;一位同事建议我使用类似的东西:
scope :available, -> { not_selected.visible.without_flags.ordered }
scope :ordered, -> (recs) { recs.order('flags.rfid_tag_id NULLS FIRST') }
并将其附加到 :visible,但我认为我不太了解如何使用 recs 概念(研究如何传递参数)?尝试在 :ordered 作用域上加入标志时,多次调用标志 table 会出错。我正在使用 Rails 4/postgresql。我怎样才能使用 join table 数据得到正确结算的顺序?
您可以将订单添加到 with_out_flags
范围。
scope :without_flags, -> {
joins("LEFT OUTER JOIN flags ON flags.rfid_tag_id = rfid_tags.id")
.order('flags.rfid_tag_id NULLS FIRST')
.where(flags: { id: nil })}
然后,如果您需要更改顺序,可以使用 reorder()
。这将使之前定义的订单查询无效,并在重新排序子句中使用您的新订单查询。
如果您仍然收到有关多次引用标志 table 的错误,您可以在联接中使用 table 别名并引用它。
scope :without_flags, -> {
joins("LEFT OUTER JOIN flags f ON f.rfid_tag_id = rfid_tags.id")
.order('f.rfid_tag_id NULLS FIRST')
.where(flags: { id: nil })}
我有一个链式范围查询,用于检查标记项目的标签并将它们从“可用”列表中删除。但是,此范围固定到“可见”范围:
scope :visible, -> { where("rfid_tags.location_id NOT IN (SELECT warehouses.id FROM warehouses WHERE warehouses.deleted_at IS NULL AND warehouses.hidden = 't') OR rfid_tags.location_type = 'Listing'") }
scope :available, -> { not_selected.visible.without_flags }
scope :without_flags, -> { joins("LEFT OUTER JOIN flags ON flags.rfid_tag_id = rfid_tags.id").where(flags: { id: nil })}
我正在尝试对可见标记进行排序,以便标记的项目位于列表的末尾;一位同事建议我使用类似的东西:
scope :available, -> { not_selected.visible.without_flags.ordered }
scope :ordered, -> (recs) { recs.order('flags.rfid_tag_id NULLS FIRST') }
并将其附加到 :visible,但我认为我不太了解如何使用 recs 概念(研究如何传递参数)?尝试在 :ordered 作用域上加入标志时,多次调用标志 table 会出错。我正在使用 Rails 4/postgresql。我怎样才能使用 join table 数据得到正确结算的顺序?
您可以将订单添加到 with_out_flags
范围。
scope :without_flags, -> {
joins("LEFT OUTER JOIN flags ON flags.rfid_tag_id = rfid_tags.id")
.order('flags.rfid_tag_id NULLS FIRST')
.where(flags: { id: nil })}
然后,如果您需要更改顺序,可以使用 reorder()
。这将使之前定义的订单查询无效,并在重新排序子句中使用您的新订单查询。
如果您仍然收到有关多次引用标志 table 的错误,您可以在联接中使用 table 别名并引用它。
scope :without_flags, -> {
joins("LEFT OUTER JOIN flags f ON f.rfid_tag_id = rfid_tags.id")
.order('f.rfid_tag_id NULLS FIRST')
.where(flags: { id: nil })}