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 がありますが、スーパーアイテムはすでに破棄されている可能性があります。だから私はクラスメソッドでそれをしなければなりません

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

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 に答える
1

過去に同様の問題がありました。それを回避するのが難しい場合があります。私は自分の目的のためにそれを行うハックっぽい方法を見つけたので、これが役立つことを願っています...

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

以下は、親を持つすべてのアイテムを取得します。「そのアイテムにはsuperitem_idがありますが、スーパーアイテムはすでに破棄されている可能性があります」と言うとき、私はあなたが何を意味するのかわかりません

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