【问题标题】:Rails ActiveRecord has_many through association queryRails ActiveRecord has_many 通过关联查询
【发布时间】:2014-02-19 02:33:23
【问题描述】:

当我直接查询我的数据库时,我得到了预期的结果,但不是在 rails 中。我猜这与我的联想有关,以及我 3 年前对 Ruby 说过的一些坏话。

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

结果:"dan@gmail.com";t;t "dan@test.com";t;t

但是来自rails 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: "dan@gmail.com">, #<User id:  nil, email: "dan@test.com">]>

那个 sn-p 是通过粘贴我试图在我的控制器中创建的内容并硬编码区域 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

这是我关联模型的方式还是我缺少的其他东西?

谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby postgresql activerecord


    【解决方案1】:

    你得到的是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' for # 在 ruby​​ 错误页面中。
    • 查询返回的是用户集合,您必须遍历各个用户的成员才能获得所需的软件属性。如果您想获取该用户所有成员的软件和文件,您可以执行类似的操作。 @members.each 做 |member|软件 = member.members.pluck(:software) 文件 = member.members.pluck(:files)。 Pluck 返回与符号名称匹配的所有属性的数组,让您能够遍历它并显示所有文件和软件
    • 我不明白为什么我必须像@JulioGMedina 推荐的那样迭代结果。它有效,但似乎会有更直接的方法。
    • 您可以直接查询成员,而不是查询成员而不是用户。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-26
    相关资源
    最近更新 更多