我有一个模型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
是否可以使用范围获得相同的结果? 或者你会做什么?
答案 0 :(得分:1)
我过去也遇到过类似的问题。它有时很难绕过它。为了我的目的,我找到了一种黑客的方法,希望这会有所帮助...
ids = []
self.find_each do |i|
ids << i.id if i.superitem
end
Model.where('id in (?)', ids)
答案 1 :(得分: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
这样你就可以拉入父节点并测试连接的superitem端的id字段是否有id。如果没有,那是因为那里没有超级项目(或者,从技术上讲,它可能存在,但没有id。但这通常不会发生。)
答案 2 :(得分:0)
以下将获取父母的所有项目,当你说“虽然该项目有superitem_id,但superitem已被销毁”时,我不确定你的意思。
items = Item.where("superitem_id IS NOT NULL")