Rails .where() attribute IS NOT NULL

19,657

Try this:

self.sections.includes(:current_revision).
  where("section_revisions.parent_secti‌​on_id IS NOT NULL")
Share:
19,657

Related videos on Youtube

Ryan King
Author by

Ryan King

Updated on September 15, 2022

Comments

  • Ryan King
    Ryan King over 1 year

    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?

  • tokland
    tokland over 7 years
    On newer versions of AR: sections.includes(:current_revision).where.not(section_revis‌​ions: {parent_section_id: nil})