包含/加入has_and_belongs_to_many并在两个模型上排序/排序

时间:2014-05-08 14:18:25

标签: ruby-on-rails activerecord join include

我认为这是一个简单的电话,我有一点脑部问题:

我有:

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中尝试一些事情;觉得这很简单,但我只是没有得到它。

2 个答案:

答案 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的语法。