8

I have a Page model containing many Section models which is associated with a SectionRevision through current_revision. From the Page model I am trying to select all Sections where the current_revision.parent_section_id is not nil.

Section model:

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'
  belongs_to :current_revision, :class_name => 'SectionRevision', :foreign_key => 'current_revision_id'

  delegate :position, to: :current_revision

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

  def children
    Section.includes(:current_revision).where(:section_revisions => {:parent_section_id => self.id})
  end
end

And Page model:

class Page < ActiveRecord::Base
  belongs_to :parent, :class_name => 'Page', :foreign_key => 'parent_page_id'
  has_many :children, :class_name => 'Page', :foreign_key => 'parent_page_id'
  belongs_to :page_image, :class_name => 'Image', :foreign_key => 'page_image_id'
  has_many :sections

  validates_uniqueness_of :title, :case_sensitive => false

  def top_level_sections
    self.sections.includes(:current_revision).where(:section_revisions => {:parent_section_id => "IS NOT NULL"})
  end

end

Page.top_level_sections is written based on: Rails where condition using NOT NULL and currently produces an empty array. It doesn't correctly detect if "parent_section_id" is not null.

How do i write Page.top_level_sections correctly?

Community
  • 1
  • 1
Ryan King
  • 3,538
  • 12
  • 48
  • 72

1 Answers1

15

Try this:

self.sections.includes(:current_revision).
  where("section_revisions.parent_secti‌​on_id IS NOT NULL")
tokland
  • 66,169
  • 13
  • 144
  • 170
Rahul Tapali
  • 9,887
  • 7
  • 31
  • 44
  • 8
    On newer versions of AR: `sections.includes(:current_revision).where.not(section_revisions: {parent_section_id: nil})` – tokland Aug 30 '16 at 21:37