如何从 rails 中的多对多丰富关联中检索已排序的条目?
How to retrieve sorted entries from many-to-many rich association in rails?
假设我在队列和花花公子之间有一个多对多的丰富关联:
队列:
has_many in_queue_positionings
has_many dudes, through: in_queue_positionings
伙计:
has_many in_queue_positionings
has_many queues, through: in_queue_positionings
InQueuePositioning 在 table 和
中有 position
列
scope :sorted, lambda { order('BY position ASC') }
在模型中定义。假设我总是需要访问按 positions
.
排序的 queue.dudes
我可以这样访问帅哥:
queue.in_queue_positionings.sorted.each { |pos| pos.dude }
但是这个方法很丑(而且可能也很慢)。那么如何优雅高效的解决这个问题呢?
试试这个:
queue.dudes.order('in_queue_positionings.position')
我们的应用程序中有以下内容:
Grant:
has_many :programs, dependent: :destroy
has_many :klasses, through: :programs
Program:
has_many :klasses, dependent: :destroy
以及以下作品:
grant.klasses.order('programs.name desc')
并且它避免了N+1
- 不应该使用
Queue
因为它可能与 Queue
冲突
Thread
- 我不确定我们是否可以在
has_many
关联中使用范围,但您可以
试试这个
InQueuePositioning
class InQueuePositioning < ...
belongs_to :queue
belongs_to :dude
end
队列
class Queue < ActiveRecord::Base
has_many :in_queue_positionings, ->{order("position ASC")}
has_many :dudes, through: :in_queue_positionings
end
并称之为
queue.dudes
假设我在队列和花花公子之间有一个多对多的丰富关联:
队列:
has_many in_queue_positionings
has_many dudes, through: in_queue_positionings
伙计:
has_many in_queue_positionings
has_many queues, through: in_queue_positionings
InQueuePositioning 在 table 和
中有position
列
scope :sorted, lambda { order('BY position ASC') }
在模型中定义。假设我总是需要访问按 positions
.
queue.dudes
我可以这样访问帅哥:
queue.in_queue_positionings.sorted.each { |pos| pos.dude }
但是这个方法很丑(而且可能也很慢)。那么如何优雅高效的解决这个问题呢?
试试这个:
queue.dudes.order('in_queue_positionings.position')
我们的应用程序中有以下内容:
Grant:
has_many :programs, dependent: :destroy
has_many :klasses, through: :programs
Program:
has_many :klasses, dependent: :destroy
以及以下作品:
grant.klasses.order('programs.name desc')
并且它避免了N+1
- 不应该使用
Queue
因为它可能与Queue
冲突Thread
- 我不确定我们是否可以在
has_many
关联中使用范围,但您可以 试试这个
InQueuePositioning
class InQueuePositioning < ...
belongs_to :queue
belongs_to :dude
end
队列
class Queue < ActiveRecord::Base
has_many :in_queue_positionings, ->{order("position ASC")}
has_many :dudes, through: :in_queue_positionings
end
并称之为
queue.dudes