如何使用与数据库无关的条件制作可链接方法(范围)

时间:2011-06-03 10:55:19

标签: ruby-on-rails activerecord scopes

我有一个模型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

是否可以使用范围获得相同的结果? 或者你会做什么?

3 个答案:

答案 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")