我认为这是一个简单的电话,我有一点脑部问题:
我有:
class Channel < ActiveRecord::Base
has_and_belongs_to_many :shows, :join_table => :channels_shows
end
class Show < ActiveRecord::Base
has_and_belongs_to_many :channels, :join_table => :channels_shows
end
一个频道有一个:position和:隐藏在数据库中(:hidden可以是false,如果没有保存则为nil,因为我忘记了默认为0)。
一个节目有:已批准(同样如:隐藏),当然还有:created_at。
我希望能够获得包含每个频道的频道(:hidden =&gt; [nil,false])显示节目的位置:已批准,最新的是最新的。
我无法弄清楚这是加入还是包含。我得到的最接近的是这个,但这并没有按照正确的顺序对包含的节目进行排序:
Channel.order('channels.position').where(:hidden => [nil, false] ).includes(:shows).where(shows:{approved: true})
仍然看着文档并在irb中尝试一些事情;觉得这很简单,但我只是没有得到它。
答案 0 :(得分:1)
要对连接记录进行排序,只需在主要排序后的order子句中包含该排序。您的频道仍然具有主要排序顺序,但是当它们相等时(即比较相同的频道但不同的节目),它将回退到按第二顺序排序(有效地排序您的包含的表格):
Channel.order('channels.position, shows.created_at').includes(:shows)...
答案 1 :(得分:0)
我认为你应该可以做这样的事情:
class Channel < ActiveRecord::Base
has_and_belongs_to_many :shows, :join_table => :channels_shows
has_and_belongs_to_many :active_shows, :class_name => 'Show', :join_table => :channels_shows, :conditions => ["approved = ?", true], :order => "created_at desc"
end
允许你去
Channel.order('channels.position').where(:hidden => [nil, false] ).includes(:active_shows)
顺便说一句,这是rails 3的语法。