2014-10-29 179 views
1

我有三個表格Business,Users和Subscriptions。目標是能夠獲得與用戶相關的業務名稱。結果應該是用戶在訂閱簽署了表的使用關係數據庫

列表

Schema |  Name  | Type | 
--------+-------------------+------- 
public | businesses  | table 
public | subscriptions  | table 
public | users    | table 

業務表

Column |   Type               
------------+----------------------------- 
id   | integer      
name  | character varying(255)  
created_at | timestamp without time zone 
updated_at | timestamp without time zone 

商業模式

class Business < ActiveRecord::Base 

end 
企業名稱的數組

訂閱表

Column |   Type         
-------------+----------------------------- 
id   | integer      
user_id  | integer      
business_id | integer      
created_at | timestamp without time zone 
updated_at | timestamp without time zone 

訂閱模型

class Subscription < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :business 
end 

用戶表

 Column  |   Type         
-----------------+----------------------------- 
id    | integer     
username  | character varying(255)  
password_digest | character varying(255)  
email   | character varying(255)  
created_at  | timestamp without time zone 
updated_at  | timestamp without time zone 

用戶模型

class User < ActiveRecord::Base 
     has_secure_password 
     has_many :subscriptions 
    end 

Rails的控制檯

u = User.find(1) 
u.subscriptions.businesses.name 

Response: undefined method `business' 

回答

1

而不是做一個額外的查詢每一個訂閱(如在阿里的答案),你可以使用Rails的只是一個查詢做到這一點內置includes方法:

subscriptions = u.subscriptions.includes(:business) 

這將返回所有訂閱及其相關企業的關係。現在,你可以得到企業的名稱,而不做其他查詢:

business_names = subscriptions.map {|sub| sub.business.name } 

認爲你也可以做到這一點的一個步驟中使用pluck

business_names = u.subscriptions.includes(:business).pluck("businesses.name") 

我不能肯定pluck戲劇不錯,includes,不過值得一試。

+0

我得到了這個錯誤協會名爲'訂閱'在訂閱上沒有找到;也許你拼錯了嗎? – user3882976 2014-11-01 22:30:02

+0

@ user3882976對不起,我認爲它應該是'includes(:business)'而不是'includes(:subscriptions =>:business)''。我已經更新了我的答案。 – 2014-11-03 19:39:20

1

,因爲用戶有許多訂閱,調用u.subscriptions返回訂閱的數組,所以你通過數組需要循環,並呼籲每個記錄business關聯。你可以實現你需要使用的是什麼:

business_names = u.subscriptions.map {|subscription| subscription.business.name } 
+0

除了這將爲每個訂閱執行一個查詢 - 如果有100個訂閱,您最終將完成100個以上的查詢。不是一個好的解決方案 – 2014-10-29 15:41:35

+0

@Jordan這隻能回答OP詢問的內容,當然可以通過多種方式進行優化,但這不是OP要求的。我可以用10個方法來使用'joins'和'includes'來實現同樣的事情。 – Alireza 2014-10-29 18:15:41

+0

我沒有說這是一個錯誤的答案,我說這不是一個好的答案。如果你「能夠通過10種方式實現同​​樣的目標」,那麼我爲什麼選擇其中一個最糟糕的原因並不清楚。 – 2014-10-29 18:17:46