【问题标题】:Rails: Find by related model attribute?Rails:按相关模型属性查找?
【发布时间】:2011-03-22 19:01:24
【问题描述】:

所以,我试图搜索如何执行此操作的示例,但我什至不确定我是否知道如何描述我正在尝试执行的操作。当谈到 SQL 时,我完全是个菜鸟,我确信这真的很基础,但我完全迷失了:

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

我想做类似的事情:Photo.where( #tag_name in [array] )

...但就像我说的那样,我不知道如何写这样的东西,或者搜索什么以查看 Google 上的示例。

谁能给我一个这种查询的例子,以及它可能被称为什么?

谢谢!

【问题讨论】:

    标签: sql ruby-on-rails ruby-on-rails-3 activerecord


    【解决方案1】:

    刚刚在我自己的类似模型上尝试过,似乎工作正常:

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

    此外,AREL querying interface rails 3 uses 上还有一个很棒的资源,其中包含有关这些和其他与查询相关的 ActiveRecord 调用的信息。

    【讨论】:

    • 太棒了。两个问题: 1- 这种查询有名称吗? 2- .group(:id) 在做什么?
    • 这是一个内部连接(activeRecord 计算出如何在标签表中自动连接,因为您使用的是has_many :through)在标签上,where 子句确定要返回的记录。在我的本地数据库中,一张照片可以有多个标签。如果一张照片被标记为herpderp,那么这个查询(没有.group)将返回同一张照片的两个相同副本(因为它匹配了两次)。 Group by id 根据 id 对结果进行唯一分组 - 因为您在 Photo 上查询,所以假定照片表的 id。
    • 对可能使用此方法的其他人的警告说明,当我将其部署到 Heroku 时,此方法破坏了 PostgreSQL(因为 .group(:id) 方法)。找到解决方案后我会发布解决方案。
    【解决方案2】:

    因此,作为 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,了解为什么这比“组”更好。

    【讨论】:

    • 警告:文章链接现在重定向到广告页面:awesomeful.net
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多