Запрос с Ruby on Rails - PullRequest
       4

Запрос с Ruby on Rails

1 голос
/ 26 февраля 2010

Привет: я борюсь с запросом рельсов. Наконец, я хочу дать ответ JSON со следующим содержанием: список всех стран, в которых есть хотя бы одна компания, связанная через «Адрес», и подсчет того, сколько компаний проживает в стране , Вот моя простая структура модели:

class Country < ActiveRecord::Base
     has_many :addresses
end

class Address < ActiveRecord::Base
     belongs_to :country
     belongs_to :company
end

class Company < ActiveRecord::Base
     has_one :address
end

Какой самый элегантный способ решить эту проблему с помощью Rails?

Ответы [ 2 ]

1 голос
/ 26 февраля 2010

Возможно, вы захотите добавить кеш счетчика к адресу

belongs_to :country, :counter_cache => :companies_count

В нем хранится количество компаний в модели страны, что избавляет вас от вопроса N + 1.

В качестве альтернативы вы можете избежать этого, также выполнив один запрос, подобный этому:

Country.find(:all, :select => 'countries.*, count(addresses.id) as companies_count', :joins => 'LEFT JOIN addresses ON addresses.country_id = countries.id', :group => 'countries.id')

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

1 голос
/ 26 февраля 2010

Вам нужно перегрузить метод to_json:

class Country < ActiveRecord::Base
     has_many :addresses
     def to_json
         # format your country as json with all the elements you need
     end
end

Затем в вашем контроллере сделайте что-то вроде этого:

countries = Country.find(:all).select{|c| c.companies.size > 0 }
json = countries.collect{|c| c.to_json }

Вам придется использовать has_many, чтобы получить компаниииз страны.Документация здесь: http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

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

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