2012-06-28 47 views
0

一個排除我有一個users表和blocked_users表。 users有我所有的認證數據,現場的喜好等,並blocked_userssource_idtarget_id續集進行以下一個查詢運行從連接表

我想回到所有用戶,用戶沒有堵塞,並且沒有阻止當前用戶的集合。

現在我有下面的代碼,我通過調用@user.available_users執行,但它執行三個查詢。有沒有辦法讓這個單一的查詢?

class User < Sequel::Model 

    one_to_many :blocked_users,  :key=>:source_id 
    one_to_many :blocked_by_users, :key=>:target_id, :class => BlockedUser 

    def block_user(id) 
    BlockedUser.create({source_id:self.id, target_id:id}) 
    end 

    def blocked_user_ids 
    self.blocked_users.map{|bu| bu[:target_id]} 
    end 

    def blocked_by_user_ids 
    self.blocked_by_users.map{|bu| bu[:target_id]} 
    end 

    def available_users 
    User.exclude(:id=>self.blocked_users.map{|bu| bu[:target_id]}).exclude(:id=>self.blocked_by_users.map{|bu| bu[:target_id]}) 
    end 
end 

我添加下面的方法來我的用戶等級:

def test_avail 
    User.exclude(:blocked_users=>self).exclude(:blocked_by_users=>self) 
    end 

1.9.3p0 :001 > User.all.first.test_avail 
    INFO - (0.000732s) SELECT * FROM `users` 
Sequel::Error: invalid association class User for association :blocked_users used in dataset filter for model User, expected class BlockedUser 

回答

2

通過協會的大力支持使用過濾器可能是最簡單的:

def available_users 
    User.exclude(:blocked_users=>self).exclude(:blocked_by_users=>self) 
end 
+0

嘿,所以我說的變化在上面的問題,但現在與片斷我得到 續集::錯誤:無效的關聯類用戶的關聯:在數據集過濾器用於模型用戶blocked_users,預計類BLOCKEDUSER – jdkealy

+0

我的錯。如果blocked_users和blocked_by_users是自引用的many_to_many關聯,則該代碼將工作。相反,您正在使用單獨的BlockedUser類和one_to_many關聯。我不確定你爲什麼這樣設置它。根據您目前的代碼,你應該能夠做到User.exclude(:ID => self.blocked_users_dataset.select(:target_id))。 –

相關問題