我正在构建一个小型项目来学习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上找到一个很好的例子......我无法相信这不是一个常见的问题。
答案 0 :(得分:3)
您忘记为takes
和provides
添加与user
和test
的关联。
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