Rails as_json включает в себя условия - PullRequest
7 голосов
/ 04 мая 2011

У меня проблемы с ограничением включения as_json динамическим атрибутом:

@pirates_ships = @current_account.pirates.as_json(:include => {:ships => {:only => [:id, :name]}}, :only => [:id, :last_name])

Это наверняка дает мне всех пиратов со своими кораблями или без них.

Но мне также нужно ограничить корабли, например, ships.ocean_id

Я попытался разрешить его, используя условия:

pirates.includes(:ships).where("ships.ocean_id = ?", @ocean.id).as_json(...)

Ограничение работает, но теперь все пираты без корабля потеряны.

Также не повезло с моим собственным синтаксисом JOIN.

Есть идеи? Ahoy

UPDATE

Мое решение пока состоит в том, чтобы вручную загружать загрузку. Таким образом, у меня могут быть мои динамические условия:

@pirates = @current_account.pirates
@ships = @current_account.ships.where({:pirate_id.in => @pirates, :ocean_id => @ocean.id})

render :json => { :pirates => @pirates.as_json(...), :ships => @ships.as_json(...) }

Мой обратный вызов Ajax теперь может повторяться: пираты и добавлять для каждого пирата его корабли, если таковые имеются. (Я использую клиентский движок шаблонов JS для генерации представления из ответа JSON)

Не очень элегантно, но в моем случае важна производительность.

Я все еще открыт для лучших идей. Я пробовал динамическое has_many: ship,: condition => ... но это немного странно.

1 Ответ

3 голосов
/ 04 мая 2011

Я думаю, что вашей лучшей ставкой будет изменение хеша @pirates_ships после его генерации из as_json (я пробовал несколько вариантов включений и т. Д. И не смог заставить что-либо работать).

@pirates_ships = @current_account.pirates.as_json(:include => :ships)
@pirates_ships.each do |pirate|
  pirate[:ships].delete_if{ |ship| ship.ocean_id != @ocean.id }
end

# Now, @pirates_ships should contain ALL pirates, as well as ships for @ocean
...