ruby-on-rails - Rails协会has_one最新记录

标签 ruby-on-rails activerecord associations

我有以下模型:

class Section < ActiveRecord::Base
  belongs_to :page
  has_many :revisions, :class_name => 'SectionRevision', :foreign_key => 'section_id'
  has_many :references

  has_many :revisions, :class_name => 'SectionRevision', 
                       :foreign_key => 'section_id'

  delegate :position, to: :current_revision

  def current_revision
    self.revisions.order('created_at DESC').first
  end
end

其中current_revision是最近创建的revision。是否可以将current_revision转换为关联,以便我可以执行类似Section.where("current_revision.parent_section_id = '1'")的查询?还是应该在数据库中添加一个current_revision列,而不是尝试通过虚拟方式或通过关联来创建它?

最佳答案

我了解您想获取每个部分的最新修订版的parent_section_id = 1的部分;

我有一个类似的情况,首先,这是SQL(请考虑将类别作为适合您的部分,将类别作为修订,将user_id作为parent_section_id-抱歉,如果我没有将代码移到您的需要,但我必须走):

SELECT categories.*, MAX(posts.id) as M
FROM `categories` 
INNER JOIN `posts` 
ON `posts`.`category_id` = `categories`.`id` 
WHERE `posts`.`user_id` = 1
GROUP BY posts.user_id
having M = (select id from posts where category_id=categories.id order by id desc limit 1)

这是Rails中的查询:
Category.select("categories.*, MAX(posts.id) as M").joins(:posts).where(:posts => {:user_id => 1}).group("posts.user_id").having("M = (select id from posts where category_id=categories.id order by id desc limit 1)")

我认为这种方法很丑陋,我认为最好的方法是“剪切”查询,但是如果您有太多的节,则在循环通过它们时将是一个问题。您还可以将此查询放入静态方法中,并且,首先想到的是,在sections表内有一个revision_id将有助于优化查询,但会降低规范化(有时是必需的),因此您必须在为该部分创建新修订时更新此字段(因此,如果您要在一个巨大的数据库中进行大量修订,那么如果服务器速度较慢,则可能不是一个好主意...)

更新
我回来了,嘿,我正在做一些测试,然后检查一下:
def last_revision
    revisions.last
end

def self.last_sections_for(parent_section_id)
  ids = Section.includes(:revisions).collect{ |c| c.last_revision.id rescue nil }.delete_if {|x| x == nil}

  Section.select("sections.*, MAX(revisions.id) as M")
         .joins(:revisions)
         .where(:revisions => {:parent_section_id => parent_section_id})
         .group("revisions.parent_section_id")
         .having("M IN (?)", ids)
end

我进行了此查询并使用了我的表(希望我对参数进行了很好的命名,这与以前的Rails查询相同,但是我在进行优化时更改了查询);当心小组;包括在内使它在大型数据集中是最佳选择,很抱歉,我找不到与has_one建立关系的方法,但是我会继续这样做,但还要重新考虑您一开始提到的字段。

关于ruby-on-rails - Rails协会has_one最新记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15824041/

相关文章:

ruby-on-rails - 为什么 alias_method 在 Rails 模型中失败

ruby-on-rails - 搜索没有最后一个的事件记录

ruby-on-rails - 如何通过关联在使用 has_many 的模型上使用 ActiveAdmin?

ruby-on-rails - Ruby on Rails 3 : Combine results from multiple has_many or has_many_through associations

MySQL 进行自连接以将具有公共(public) ID 的记录组合起来

ruby-on-rails - Rails has_many 通过、分组和汇总数据

ruby-on-rails - 在 Rails 应用程序中运行异步作业的最佳方式是什么?

mysql - 如何从 Rails 3 中的 Stripe gem 捕获 Web hook?

ruby-on-rails - rails : change default JSON structure

ruby-on-rails - rails : WickedPDF: Page Breaks