【问题标题】:Rails .where() attribute IS NOT NULLRails .where() 属性不为空
【发布时间】:2013-03-28 15:51:18
【问题描述】:

我有一个 Page 模型,其中包含许多 Section 模型,这些模型与 SectionRevisioncurrent_revision 相关联。从Page 模型中,我尝试选择所有Sections,其中current_revision.parent_section_id 不为零。

Section模特:

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

还有Page模特:

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 是基于:Rails where condition using NOT NULL 编写的,当前生成一个空数组。它不能正确检测“parent_section_id”是否不为空。

如何正确写Page.top_level_sections

【问题讨论】:

  • Page.top_level_sections 的意图是什么?它是否试图找到没有修订的部分?
  • 试图找到 current_revision.parent_section_id 不是 nil 的部分。

标签: ruby-on-rails model associations


【解决方案1】:

试试这个:

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

【讨论】:

  • 在较新版本的 AR 上:sections.includes(:current_revision).where.not(section_revisions: {parent_section_id: nil})
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-24
  • 1970-01-01
  • 2011-06-22
  • 2020-05-13
相关资源
最近更新 更多