2011-03-22 61 views
3

所以,我试图寻找一个如何做到这一点的例子,我不知道我甚至不知道如何描述我想要做的事情。当谈到SQL时,我是一个彻头彻尾的noob,我确信这是非常基本的,但我完全失去了:Rails:通过相关模型属性查找?

我有一个模型,Photo,其中has_many :tags, :through => :taggings。标签有一个名称和一个ID。

我想要做的事,如:Photo.where(#tag_name in [array])

......但就像我说我不知道​​如何写类似的东西,或者什么搜索看看在谷歌的例子。

任何人都可以给我一个这种查询的例子,它可能被称为?

谢谢!

回答

1

所以,作为Brett的方法一拧,事实证明了以下工作没有打破PostgreSQL的:

def self.tagged_with(string) 
    array = string.split(',').map{ |s| s.lstrip } 
    select('distinct photos.*').joins(:tags).where('tags.name' => array) 
end 

问题解决了!请参阅this article了解为什么这是一个比'group'更好的主意。

+5

两个downvotes没有评论?不是很有用。 – Andrew 2011-03-29 05:17:14

+0

警告:文章链接现在重定向到一个广告页面:http://www.awesomeful.net/ – theUtherSide 2017-10-09 22:04:40

9

只是尝试这样做我自己的一个类似的模型,似乎很好地工作:

Photo.joins(:tags).where('tags.name' => ['herp','derp']).group(:id) 

而且,这里的AREL querying interface rails 3 uses一个巨大的资源,有关于这些和其他的ActiveRecord调用相关的查询。

+0

太棒了。两个问题:1-这种查询是否有名字? 2-什么是.group(:id)在做什么? – Andrew 2011-03-22 19:13:20

+0

这是一个内部联接(activeRecord在标签中指出如何自动连接标签表,因为您使用'has_many:through'),where子句确定要返回哪些记录。在我的本地数据库中,照片可以有多个标签。如果一张照片被标记为“herp”和“derp”,那么这个查询(不带'.group')将返回同一张照片的两个相同副本(因为它匹配两次)。按ID分组结果基于ID唯一 - 这是因为你正在查询照片,假设照片表的ID。 – 2011-03-22 19:29:13

+0

非常感谢您的帮助! – Andrew 2011-03-22 19:42:55