Ruby on Rails按子属性命令父模型

时间:2013-07-30 20:42:45

标签: ruby-on-rails rails-activerecord

我该怎么做呢?我想根据它的孩子的属性对选择父模型进行排序。父模型与它的孩子有很多关系。我不确定如何形成ActiveRecord查询来获取此信息。

示例:一个帖子有很多帖子。我想获取与其相关的最新帖子所订购的线程集合。

我找到了一些将选择转换为数组并对该数组进行排序的解决方案,但是我需要选择保留为ActiveRecord选项,因此我可以继续将查询链接到它上面。 / p>

3 个答案:

答案 0 :(得分:4)

我需要有关数据库布局的更多信息以提供更好的示例,但是您可以加入另一个表,然后按该表排序:

Thread.joins(:posts).order("posts.created_at").group("threads.id")

答案 1 :(得分:3)

对于您的示例,简单地让孩子接触父母会更有效率:

class Thread < ActiveRecord::Base
  has_many :posts
end

class Post < ActiveRecord::Base
  belongs_to :thread,
        touch: true
end

每当创建或更改帖子时,这将更改Thread的updated_at列,以便在那时认为该线程已更新。您可能需要在更复杂的示例中实际访问子记录,但是为了按子帖的日期排序,这样可以节省您在实际上不需要该表中的信息时从数据库中获取额外记录的情况。

答案 2 :(得分:0)

通过使用普通查询,没有直接迭代数组,您可以执行以下操作:

Post.joins(:thread).includes(:thread).order("posts.created_at").group("thread_id").take(5) 
# Maybe you can take only a few samples of your collection to show on Last Posted Topics, 
# then you just replace take(5) with the number of posts you want to take.