2011-04-05 112 views
6

我覺得這是非常基本的,但我很可怕與SQL所以我不知道該怎麼辦呢?的Rails 3 HABTM通過記錄相關聯的模型屬性找到

我有兩個型號之間的標準HABTM關係,LandUse和照片。所以我有一個land_uses_photos連接表,並且每個模型都有標準的宏,如:

Photo 
has_and_belongs_to_many :land_uses 

土地利用表有:ID和名稱(字符串)。

我想查找照片,其中Land Use Name ='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` 

那是假的,這裏有兩個對的土地利用和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 

那麼,我該如何做這種查找?爲了讓它只有一個問題而不是兩個,我怎麼能找到一個「和」條件而不是隻有一個「或」條件?

謝謝!

回答

7
Photo.joins(:land_uses).where('land_uses.name' => ['foo', 'bar', 'baz']) 
+0

這做到了。謝謝! – Andrew 2011-04-05 17:16:31

+0

你知道'joins'和'includes'之間的區別是什麼嗎? – Andrew 2011-04-05 17:17:44

+2

當您想要加載關聯數據時,請使用'includes'。當你想避免N + 1問題時,這很有用。在其他地方使用'joins',因爲它會生成更簡單,更快速的sql。 – 2011-04-05 17:25:38

1

你創自表名的「身份證」的錯誤是:land_uses,而不是land_use

+0

哦,好吧,這是表名不是型號名稱...仍在學習,但這有幫助,謝謝! – Andrew 2011-04-05 17:17:06

相關問題