Как создать цепочечные методы (области) с условиями, не привязанными к базе данных - PullRequest
1 голос
/ 03 июня 2011

У меня есть модель 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 ]

1 голос
/ 03 июня 2011

У меня была похожая проблема в прошлом. Иногда трудно обойти это. Я нашел хакерский способ сделать это для своих целей, поэтому надеюсь, что это поможет ...

 ids = []
 self.find_each do |i|
    ids << i.id if i.superitem
 end
Model.where('id in (?)', ids)
1 голос
/ 03 июня 2011

В 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на суперитемной стороне соединения есть идентификатор.если это не так, то это потому, что там нет суперитема (или, технически, он мог бы быть там, но не иметь идентификатора. Но это обычно никогда бы не произошло).

0 голосов
/ 03 июня 2011

Следующее получит все элементы с родителем, я не уверен, что вы имеете в виду, когда говорите: «Хотя этот элемент имеет superitem_id, superitem уже может быть уничтожен»

items = Item.where("superitem_id IS NOT NULL")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...