通过关联查询Rails ActiveRecord has_many
问题描述:
当我直接查询我的数据库时,我得到了预期的结果,但没有在rails中。我猜测它与我的关联有关,而且我在3年前对Ruby说过很多坏话。通过关联查询Rails ActiveRecord has_many
Postgres的SQL查询:
SELECT users.email, members.software, members.files
FROM users INNER JOIN members
ON members.user_id = users.id
WHERE members.region_id=2
结果: “[email protected]”;吨; T “[email protected]”;吨;吨
但是从轨c:
> ←[1m←[36mUser Load (1.0ms)←[0m ←[1mSELECT users.email,
> members.software, members.files FROM "users" INNER JOIN "members" ON
> "members"."user_id" = "users"."id" WHERE "members"."region_id" =
> 2←[0m> => #<ActiveRecord::Relation [#<User id: nil, email: "[email protected]">, #<User id: nil, email: "[email protected]">]>
这段代码是粘贴在我试图在我的控制器中创建的结果查询和硬编码reg离子ID:
User.joins(:members).select("users.email, members.software, members.files").where(members: {region_id: params[:id]})
这是我的模型:
class User < ActiveRecord::Base
has_many :members
has_many :regions, :through => :members
end
class Region < ActiveRecord::Base
has_many :members
has_many :users, :through => :members
end
class Member < ActiveRecord::Base
belongs_to :user
belongs_to :region
end
难道,我很想念我有相关的我的模型的方式还是其他什么东西?
谢谢!
答
你得到的是active_relations
对象。
您可以访问属性这样
users = User.joins(:members).select("users.email, members.software as software, members.files as files").where(members: {region_id: params[:id]})
users.each do |u|
p u.email
p u.software
p u.files
end
权,所以当我有我的控制器顶部行@members = ......在我看来,底部它告诉我未定义的方法'softare '为#在红宝石错误页面。 – IveMadeAHugeMistake
查询返回一组用户,您将不得不遍历各个用户的成员以获取所需的软件属性。如果你想获得该用户的所有成员的软件和文件,你可以做类似的事情。 @ members.each do | member | softwares = member.members.pluck(:software)files = member.members.pluck(:files)。 Pluck返回一个与符号名称相匹配的所有属性数组,让您能够遍历该数据并显示所有文件和软件 –
我不明白为什么我必须迭代结果,如@JulioGMedina建议。它有效,但似乎会有更直接的方式。 – IveMadeAHugeMistake