【问题标题】:Rails 3 HABTM find by record associated model attributeRails 3 HABTM 通过记录关联模型属性查找
【发布时间】:2011-04-05 16:22:43
【问题描述】:

我认为这真的很基本,但我对 SQL 很糟糕,所以我不知道该怎么做...

我在 LandUse 和 Photo 这两个模型之间有一个标准的 HABTM 关系。所以我有一个land_uses_photos 连接表,每个模型都有标准宏,比如:

Photo
has_and_belongs_to_many :land_uses

土地利用表有:ID,和Name(string)。

我想查找土地使用名称 = 'foo'、'bar' 或 'baz' 的照片。我该怎么做?

我看了this question 并尝试了:

Photo.includes(:land_uses).where('land_use.id'=>[6,7])

...但这给了我:

ActiveRecord::StatementInvalid: No attribute named `id` exists for table `land_use`

这是假的,这是 LandUse 和连接表的 schema.rb:

create_table "land_uses", :force => true do |t|
  t.string   "name"
  t.datetime "created_at"
  t.datetime "updated_at"
  t.integer  "display_order"
end

create_table "land_uses_photos", :id => false, :force => true do |t|
  t.integer "land_use_id"
  t.integer "photo_id"
end

那么,我该如何进行这种查找呢?为了让它只有一个问题而不是两个问题,我怎么能找到一个“和”条件而不是一个“或”条件?

谢谢!

【问题讨论】:

    标签: sql ruby-on-rails ruby-on-rails-3 has-and-belongs-to-many


    【解决方案1】:
    Photo.joins(:land_uses).where('land_uses.name' => ['foo', 'bar', 'baz'])
    

    【讨论】:

    • 你知道joinsincludes有什么区别吗?
    • 当您想要预先加载关联数据时使用includes。当您想避免 N+1 问题时,这很有用。在其他任何地方都使用joins,因为它会生成更简单、更快的 sql。
    【解决方案2】:

    由于表名是:land_uses 而不是land_use,因此您生成了一个“id”错误

    【讨论】:

    • 哦,好的,这是表名而不是模型名...仍在学习,但这有帮助,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-11
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    相关资源
    最近更新 更多