Rails3 ActiveRecord,2级结果访问

时间:2013-02-14 20:55:50

标签: ruby-on-rails-3 rails-activerecord

我有一些AR模型

User
 has_many :clients, :through => :users_to_clients
 has_many :files

Client
 has_many :users_to_clients
 has_many :users, :through => :users_to_clients
 has_many :files

File
 belongs_to :client
 belongs_to :user

并尝试通过分配给用户

的客户端获取所有文件
u = User.includes(:clients => :xls_files).find(1)

此代码触发3个sql查询。在最终的sql看起来像我需要的那样,他通过用户的客户端fecth所有文件。

SELECT "files".* FROM "files" WHERE "files"."client_id" IN (1, 2)

但如果你的变量只包含User对象,如何获取这些数据?

2 个答案:

答案 0 :(得分:0)

试试这个

User
    has_many :files
    has_many :clients, :through => :files

Client
    has_many :files
    has_many :users, :through => :files

File
    belongs_to :users
    belongs_to :clients

然后您可以执行@user.clients@client.users

之类的操作

我无法从您的帖子中了解到,但您可能需要切换客户端和文件模型,因此客户端属于用户和文件,具体取决于您的具体情况。

答案 1 :(得分:0)

我找不到任何解决方案,所以我通过在文件模型中添加范围来手工制作

scope :by_user_clients, lambda { |user| where(client_id:
user.clients.pluck(:id)) }


File.by_user_clients(@user)