2012-02-24 51 views
1

Merchant has_many ShopsActiveRecord的 - 检索一个记录每个关联

Shop belongs_to Merchant

即一个merchant(星巴克)可以有许多商店的位置。

我使用Gecoder来获取附近的商店,例如@shops = Shop.near("Times Square")

我只想为每个商家只返回1条记录。即@shops只包含1个星巴克,1个地铁,但是是一个集合。

对不起,我一直在谷歌搜索和SO搜索无济于事。也许我不是用正确的词来描述我想要的。提前致谢。

回答

1

我搜索了一下,并且发现了SQL的group by

如果我有4 shops belonging to 2 merchants附近称为“莱佛士坊”,在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

要回答你应该使用Google搜索,加入或组合查询scope可能会解决你想要做的。如果您使用:or逻辑组合查询构建一个范围,每个店铺只有一个,限于第一条记录,您应该得到您要查找的内容。

我不会假装说我了解地理编码或先进范围足以做到这一点,但我发现,显示了另一个问题,这种做法的例子:

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})})" 
}} 

这是来自这太问题:Combine two named scopes with OR (instead of AND)

希望这可以帮助您找到解决方案。

+0

谢谢!哇2简单的代码行,但我的豌豆脑没有真正得到它。我会试一试。您可以假设我只想要一个Shop.all,其中每个唯一的':merchant_id'只代表一次。 – 2012-02-24 06:58:29

+0

要清楚,这不是解决您确切问题的代码。这只是一个概念的例子,你可能会开始用Google来学习如何解决你的问题。 – 2012-02-24 07:29:51

+0

当然是=)。我只是希望Rails可能有一些神奇的子弹来解决这个问题。我知道它是一个带有“子查询”的查询。 – 2012-02-24 08:17:31

相关问题