【发布时间】:2014-06-12 11:58:23
【问题描述】:
我知道过去曾发布过类似的问题,我试图在 rails 指南或以前帖子的答案中找到解决方案,但答案要么对我不起作用,要么不是我想要的正在寻找。我有以前的 SQL 经验(主要是 MySQL),我目前正在为一个新项目探索 Rails。
我有一个“用户”表和一个“公司”表。一个用户永远只属于一个公司,但一个公司可以有很多用户。 我的数据的简单表示是:
users has the following attributes: id (INT), name(string), email(string), company_id
companies has the following attributes: id (INT), company_name(string), address(string)
当我直接在数据库中(不在 rails 中)执行以下 SQL 查询时:
SELECT users.name, company.address FROM companies INNER JOIN users on
users.company_id=companies.id
我收到两列回复,第一列是 users.name,第二列是该用户所属的 company.adres。因为是inner join,没有用户的公司或者没有公司的用户都没有列出来,这正是我所需要的。
现在尝试将此查询“翻译”成 rails(我使用的是 Rails 4.1.1),我首先定义了 User 模型和 Company 模型,从而在模型目录中创建了它们各自的 user.rb 和 company.rb。对于 user.rb 我声明了“belongs_to :company”,对于 company.rb 我声明了“has_many :users”。
迁移等后...我使用 rails 控制台添加一些数据并进行测试。单个模型上的所有查询都可以正常工作,还有像
这样的查询Users.find(1).company.address
工作正常,但是当我输入以下命令时:
e = Company.select("companies.company_name, users.name").joins(:users)
说明rails生成了如下SQL查询:
SELECT companies.company_name, users.name FROM "companies" INNER JOIN "users" ON "users"."company_id" = "companies"."id"
我想这与我直接访问数据库时使用的查询相同。显示查询后,显示结果,但未给出 users.name 属性。结果是一个具有正确数量元素的数组(即没有显示没有公司的用户或没有没有用户的公司),但只给出了 Company 模型的属性,缺少 user.name 属性:
#<ActiveRecord::Relation [#<Company id: nil, address: "addresexample1">, #<Company id: nil, address: "addresexample3">, #<Company id: nil, address: "addressexample4">]>
是我做错了什么,还是我期望在 Rails 中出现不正确的事情?
【问题讨论】:
-
试试这样
e = Company.joins(:users).select("companies.company_name, users.name") -
尝试
companies = Company.select("companies.company_name AS company_name, users.name AS user_name").joins(:users)并显示:companies.each{ |c| puts c.company_name, c.user_name } -
也许甚至 e = Company.joins(:users).select("companies.company_name, users.name") 作品基于guides.rubyonrails.org/…
-
@pavan,感谢您的建议。正如您在下面看到的,问题不在于我如何制定查询,而在于我如何处理其结果。
-
@Octopus-Paul:感谢您的建议,这与下面 John 的回答一致。
标签: sql ruby-on-rails