Ruby on Rails + Active_Record: как включить количество дочерних элементов в результат? - PullRequest
3 голосов
/ 01 сентября 2011

Я выяснил, как включить дочерние элементы в результат to_json, создав метод as_json в модели папок.

def as_json(options={ })
  super(
          options.merge(
                  :include => {
                          :children => { }
                  }
          )
  )
end

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

Кажется, я не могу найти эффективный способ сделать это.

Я использую приведенный ниже код для возвратасписок папок.

def index
  @folders = Folder.all(:order => "Name")

  respond_with(@folders) do |format|
    format.jsonp { render :json => @folders, :callback => params[:callback] }
  end
end

Наконец, я хочу убедиться, что счетчик возвращается во всех результатах, а не только в json.json является наиболее важным, но я хочу убедиться, что он есть и в других.

Я думал, что смогу добавить счетчик для каждой из папок, возвращаемых @folders после запроса, используя.размер.Тем не менее, это, похоже, не работает ...

Затем я начал изучать добавление метода к модели папки, например ...

def child_count
  write_attribute(:child_count, children.size)
end

Но, посмотрев на него, японял, что это на самом деле не сработает ...

Так что теперь я смотрю на: выберите, чтобы сделать немного магии sql ... но я действительно не хочу идти по этому пути, если есть более чистый путь.

Советы приветствуются!

1 Ответ

4 голосов
/ 01 сентября 2011

Просто добавьте метод child_count, который возвращает количество детей, а затем используйте параметр :methods для as_json:

def as_json(options = { })
    super(options.merge(:methods => :child_count))
end

Возможно, вы захотите бытьнемного более осторожно с этим merge, хотя, если :methods уже есть в options, вы перезапишите его;что-то вроде этого может послужить вам лучше, чем прямое слияние:

def add_child_count(options)
    options[:methods] = [ options[:methods], :child_count ].flatten.compact.uniq
    options
end

def as_json(options = { })
    super(add_child_count(options))
end

Для XML вы делаете почти то же самое с to_xml вместо as_json.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...