1

我有一个模型Item,它与自身有关。

class Item < ActiveRecord::Base
  has_many :subitems, :class_name => "Item", :foreign_key => "superitem_id"
  belongs_to :superitem, :class_name => "Item"
end

我想查询所有有父项的项目。首先,我尝试检查 parent_id 是否存在Item.where("superitem_id != ?", false),或者类似的东西。但它不起作用。尽管该项目具有 superitem_id,但 superitem 可能已经被销毁。所以我必须用类方法来做

def self.with_superitems
  items = []
  self.find_each do |i|
    items << i if i.superitem
  end
  return items
end

但它使链接成为不可能,我想用类似的方法链接它,比如

def self.can_be_stored
  items = []
  self.find_each do |i|
    items << i if i.can_be_stored?
  end
  return items
end

是否可以使用范围实现相同的结果?或者你会怎么做?

4

3 回答 3

1

我过去也遇到过类似的问题。有时很难绕过它。为了我的目的,我找到了一种 hack-ish 方式,所以希望这会有所帮助......

 ids = []
 self.find_each do |i|
    ids << i.id if i.superitem
 end
Model.where('id in (?)', ids)
于 2011-06-03T11:29:58.027 回答
1

在rails 2中我会这样做

items = Item.find(:all, :include => [:superitems], :conditions => ["superitems.id is not null"])

与此等效的 rails3 是

Item.includes([:superitem]).where("superitems.id is not null").all

这样,您将拉入父项并测试联接的超项侧的 id 字段是否具有 id。如果没有,那是因为那里没有超项(或者,从技术上讲,它可能存在但没有 id。但这通常不会发生)。

于 2011-06-03T12:09:31.703 回答
0

以下将获取所有带有父项的项目,当您说“尽管该项目具有 superitem_id,superitem 可以已经被销毁”时,我不确定您的意思

items = Item.where("superitem_id IS NOT NULL")
于 2011-06-03T11:06:37.487 回答