Фильтрация ActiveRecord запрашивает в направляющих

Базовые данные хранят экземпляры NSManagedObject или их подклассы. Сам NSManagedObject очень похож на словарь. Отношения ко-многим между объектами представлены в виде наборов. Базовые данные не имеют упорядоченного списка, который бы соответствовал массиву. Вместо этого, когда вы извлекаете объекты из основного хранилища данных, вы используете запрос на выборку. Этот запрос на выборку может указывать один или несколько дескрипторов сортировки, которые используются для сортировки объектов, а объекты, возвращаемые запросом на выборку, сохраняются в массиве.

Если важно сохранить порядок объектов, вам нужно включить в вашу сущность атрибут, который можно использовать для сортировки объектов при их извлечении.

24
задан user94154 1 June 2009 в 21:43
поделиться

4 ответа

То, что вы хотите, называется областями действия:

class Item < ActiveRecord::Base
  named_scope :by_author, lambda {|author| {:conditions => {:author_id => author.id}}}
  named_scope :since, lambda {|timestamp| {:conditions => {:created_at => (timestamp .. Time.now.utc)}}}
  named_scope :archived, :conditions => "archived_at IS NOT NULL"
  named_scope :active, :conditions => {:archived_at => nil}
end

В ваших контроллерах используйте следующее:

class ItemsController < ApplicationController
  def index
    @items = Item.by_author(current_user).since(2.weeks.ago)
    @items = params[:archived] == "1" ? @items.archived : @items.active
  end
end

Возвращаемый объект является прокси, и запрос SQL не будет выполняться, пока вы действительно не начнете делать что-то реальное с коллекцией, например как итерация (для отображения) или когда вы вызываете методы Enumerable на прокси.

39
ответ дан 28 November 2019 в 23:18
поделиться

Я бы не стал делать это так, как вы предлагаете.

Так как find возвращает массив, вы можете использовать методы массива для его фильтрации, например:

Item.find(:all).select {|i| i.foo == bar }.select {|i| i.whatever > 23 }...

Вы также можете получить то, что вы хотите с именованными областями.

7
ответ дан 28 November 2019 в 23:18
поделиться

Вы можете (или, по крайней мере, использовали) подобный фильтр в Rails:

find(:all, :conditions => { :foo => 'foo', :bar => 'bar' })

, где: foo и: bar - имена полей в активной записи. Похоже, все, что вам нужно сделать, это передать хэш из пар: field_name => value.

1
ответ дан 28 November 2019 в 23:18
поделиться

Вы можете посмотреть на Searchlogic .
Это упрощает использование условий на Наборы ActiveRecord и даже на Arrays .

Надеюсь, это поможет.

1
ответ дан 28 November 2019 в 23:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: