ActiveRecord - получить одну запись для каждой ассоциации - PullRequest
1 голос
/ 24 февраля 2012

Merchant has_many Shops

Shop belongs_to Merchant

т. Е. У одного merchant (Starbucks) может быть много магазинов.

Я использую Gecoder для поиска ближайшегомагазины, например @shops = Shop.near("Times Square").

Я хотел бы вернуть только 1 запись только для каждого продавца.Т.е. @shops содержит только 1 Starbucks, 1 Subway, но является коллекцией.

Извините, я гуглил и искал на SO, но безрезультатно.Возможно я не использую правильное слово, чтобы описать то, что я хочу.Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 25 февраля 2012

Я немного погуглил и наткнулся на group by для SQL.

Если у меня есть 4 shops belonging to 2 merchants рядом с местом под названием «Raffles Place», в пределах 1 kilometer.

Вызов Shop.near("Raffles Place",1) возвращает 4 shops.

Если я добавлю group к Shop.near("Raffles Place",1).group(:merchant_id), будет возвращено только 2 shops.

Это можно использовать и с другими условиями, такими как Shop.where(:featured=>true).group(:merchant_id), чтобы показывать только 1 магазин на каждого выбранного торговца.

1 голос
/ 24 февраля 2012

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

Я не буду притворяться, что я достаточно хорошо понимаю Geocoder или расширенные области, чтобы сделать это, но я нашел пример, демонстрирующий этот подход, в другой проблеме:

named_scope :or, lambda { |l, r| {
  :conditions => 
      "annotations.id IN (#{l.send(:construct_finder_sql,{:select => :id})}) or " + 
      "annotations.id IN (#{r.send(:construct_finder_sql,{:select => :id})})" 
}}

Это происходит из-за этого SOвопрос: Объедините две именованные области с ИЛИ (вместо И)

Надеюсь, это поможет вам найти решение.

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