Вы можете использовать SelectMany
, чтобы объединить коллекции Child в одну коллекцию, а затем отфильтровать их:
parent
.SelectMany(p => p.Children)
.Where(c => c.GrandChildren
.Any(g => g.Name == "John"))
Существуют преимущества для использования отдельного DBS (включая тех, которых Вы уже перечислили):
Все, что, будучи сказанным, вероятно, лучше дано единственное решение DB:
Спасибо за замечательные комментарии. Я решил пойти с несколькими подход базы данных. Это - самый легкий путь для меня, так как я не должен переделывать целое приложение.
Что я собираюсь сделать, должен добавить before_filter в application_controller, таким образом, он относится ко всем контроллерам... что-то вроде этого:
before_filter :client_db # switch to client's db
Затем в application_controller.rb я буду включать что-то вроде этого:
def client_db @client = Client.find(params[:client_id]) spec = Client.configurations[RAILS_ENV] new_spec = spec.clone new_spec["database"] = @client.database_name ActiveRecord::Base.establish_connection(new_spec) end
Затем URL как example.com? client_id=12345 выберет корректную базу данных.
Так как я использую Apache в качестве прокси перед Полукровкой, Apache добавит корректный client_id ко всем запросам, на основе URL веб-сайта клиента. Таким образом, client_id на самом деле не будет частью URL, который видят пользователи. Это будет только передано между Apache и Полукровкой. Я не уверен, объясняю ли я это правильно, но это работает и содержит вещи в чистоте и простой.
Если я решаю, что должен использовать единую базу данных в будущем, я могу осуществить рефакторинг весь код затем. В данный момент это, кажется, самый простой подход.
Кто-либо видит какую-либо проблему с этим подходом?
- John
Я пошел бы для единой базы данных, с помощью клиентских идентификаторов - необходимо смочь сделать рефакторинг менее болезненным при помощи некоторой формы базовой модели и именованного объема для обзора любых действий к идентификатору того клиента.
Вы могли пользоваться библиотекой индексации, такой как Хорек или что-то вдоль тех строк, чтобы заниматься проблемой полнотекстовых поисков, становящихся медленными. Это будет проблемой так или иначе, после того как база данных единственного клиента становится к большому, таким образом, Вы, возможно, должны реализовать это так или иначе.