2014-10-29 103 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