Rails - 多对多查询

时间:2014-03-09 23:54:35

标签: ruby-on-rails activerecord

我正在构建一个小型项目来学习rails,并且在查询具有多对多关系的数据时非常非常困难。

有问题的4个模型是用户,测试,接受和提供。用户可以进行多次测试,许多用户都可以进行测试。用户还可以提供许多测试,并且测试可以由许多用户提供。

以下是我的模特:

class Provide < ActiveRecord::Base
    belongs_to :user
    belongs_to :test
end

class Take < ActiveRecord::Base
    belongs_to :user
    belongs_to :test
end

class User < ActiveRecord::Base
    has_many :tests, through: :take
    has_many :tests, through: :provide
    has_one :user_type
end

class Test < ActiveRecord::Base
    has_many :users, through: :take
    has_many :users, through: :provide
    has_many :questions
end

现在,我想得到的是这两个查询:

-- information on users providing a specific test
select u.*
from   users u
       join provides p
           on u.id = p.user_id
       join tests t
           on t.id = p.test_id
where t.id = '1'

-- get information for all users currently taking a test
select u.*
from   users u
       join takes tak
           on u.id = tak.user_id
       join tests tes
           on tes.id = tak.test_id
where tes.id = '1'

所以,从我收集的内容来看,我应该能够类似地查询一对多的关系,并且只使用:includes,但我似乎无法让它工作。

这就是我的意思:

@Test = Test.includes(:users).where("id = ?", 1)

从这里开始,我希望能够通过以下方式访问用户:

@Test.users.all

有人有任何意见吗?这让我疯了,我无法在rails docs上找到一个很好的例子......我无法相信这不是一个常见的问题。

1 个答案:

答案 0 :(得分:3)

您忘记为takesprovides添加与usertest的关联。

class User < ActiveRecord::Base
  has_many :takes
  has_many :tests, through: :takes

  has_many :provides
  has_many :tests, through: :provides
end

class Test < ActiveRecord::Base
  has_many :takes
  has_many :users, through: :takes

  has_many :provides
  has_many :users, through: :provides
end