2015-12-28 24 views
2

我有以下類別:Rails Mysql:如何只包含符合我的條件的has_many關係對象?

class User < ActiveRecord::Base 
     has_many :keys 
    end 

    class Key < ActiveRecord::Base 
     belongs_to :room 
    end 

    class Room < ActiveRecord::Base 
     #has column "surface_area" 
    end 

我要查詢的是有房有10 surface_area,僅包括客房有10

我的表面面積的按鍵鍵的所有用戶有以下查詢:

User.joins(keys: :room).where('room.surface_area= ?', 10) 

這將返回其具有鍵爲10 room.surface_area的用戶,但它包括了所有的鍵,所以也鍵具有室具有比10不同的表面積我只想返回潛艇其具有與10

錯誤返回值的表面積的房間的鑰匙的等:

Users:{ 
keys: [ 
    {id: 1, surface_area: 11}, 
    {id: 2, surface_area: 10}, 
    {id: 3, surface_area: 10} 
] 
} 

正確的返回值:爲用戶

Users:{ 
    keys: [ 
     {id: 2, surface_area: 10}, 
     {id: 3, surface_area: 10} 
    ] 
    } 

json.rabl文件

collection @users, :root => :users, :object_root => false 

child :keys do 
    extends "keys" 
end 
+0

刪除,如果它不工作,只是刺傷'User.joins(keys::room).where(room:{surface_area:10})'試試這個 –

回答

1
User.joins(keys: :room).where('room.surface_area= ?', 10) 

This co命令查詢用戶並返回具有表面面積= 10的房間的鍵的用戶。這是正確的。但是當你在其中一個用戶上撥打keys時,你可以獲得他們擁有的所有密鑰。這也是正確的,因爲這是什麼has_many :keys協會。

你需要的是來定義用戶模型的新實例方法,就像這樣:

def keys_for_rooms_with_surface_area(area) 
    keys.joins(:room).where('rooms.surface_area = ?', area) 
end 

如果你想has_many :keys總是返回鍵配有面積= 10,你可以像這樣:

has_many :keys, ->() { joins(:room).where('rooms.surface_area = 10') } 

在這種情況下,你的第一個查詢應該是這樣的:

User.joins(keys: :room) 
+1

是的,我剛剛在User中添加了一個方法'keys_for_rooms_with_surface_area(area)',並從.rabl文件調用函數作品謝謝! – MeesterPatat

0

爲什麼不試試...

#app/models/user.rb 
class User < ActiveRecord::Base 
    has_many :keys do 
     def surface_area surface_area 
     joins(:room).where(room: { surface_area: surface_area }) 
     end 
    end 
end 

這應該給你打電話的能力:

@user = User.find params[:id] 
@user.keys.surface_area 10 

我會在黑暗中

相關問題