2014-03-05 42 views
1

如果我有以下的(简化)模型:模型:帐户 - >用户 - >帖子..如何获取帐户的所有帖子? (Rails的方式)

Accounts: 
- id 
- name 

Users: (belongs to Accounts) 
- id 
- account_id 
- name 

Posts: (belongs to Users) 
- id 
- user_id 
- title 
- body 

是这样来获取一个账户职位的最佳方法是什么?

posts = [] 
account.users.each do |user| 
    posts.merge(user.posts) 
end 
posts.sort_by_created_at 

在过去,我可能会提出一个ACCOUNT_ID在帖子表格怎么把它好像很多数据库查询,如果有很多用户,我担心性能 - 和同步问题有两个account_ids(用户,然后帖子,当帐户和帖子已经被用户链接:user_id - >帖子:account_id - >帐户)。希望对此有任何建议。由于

回答

4

在account.rb

has_many :posts, :through => :users 

然后获取与帐户

account.posts.each do |post| 
    # your code 
end 

现在关联,以减少不的所有信息。您可以连接的表的数据库查询,从数据库中获取帐户数据的时候可以“通过的has_many”是,它采用了内部连接使用此查询

account = Account.where(your_condition).includes(:posts) 
0

的问题。它不适合在任何地方使用连接。示例场景:如果您拥有数千个帐户,每个帐户有数千个用户,每个用户都有数千个帖子,则连接表将包含1000 * 1000个记录。

我会建议另一种方法。

def posts 
    Post.where(user_id: users.pluck(:id)) 
end 

pluck方法只从数据库中检索指定的字段,而不是从整个记录中检索指定的字段。上述方法将触发2个查询:1)检索所有用户ID 2)检索其中user_id位于指定的ID数组中的帖子。

上述方法可以在任何帐户对象上被用作

@account.posts 
相关问题