我知道过去发布了类似的问题,我试图在导轨指南或以前的帖子的答案中找到解决方案,但要么答案对我不起作用,要么他们不是我的正在寻找。我有以前的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)
当我直接在数据库中执行以下SQL查询时(不在rails中):
SELECT users.name, company.address FROM companies INNER JOIN users on
users.company_id=companies.id
我得到了第2列的回复,第一列中的users.name和第二列中该用户所属的company.adres。由于它是一个内部联盟,没有用户或没有公司的用户的公司没有列出,这正是我需要的。
现在尝试"翻译"这个查询到rails(我正在使用Rails 4.1.1),我首先定义了User模型和Company模型,从而在models目录中创建了各自的user.rb和company.rb。对于user.rb,我声明了" belongs_to:company"对于company.rb,我宣布" has_many:用户"。
迁移后等...我使用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属性。结果是一个具有正确元素数量的数组(即没有显示没有公司的用户或没有显示用户的公司),但只给出了公司模型的属性,缺少user.name属性:
#<ActiveRecord::Relation [#<Company id: nil, address: "addresexample1">, #<Company id: nil, address: "addresexample3">, #<Company id: nil, address: "addressexample4">]>
我做错了什么,或者我认为Rails中的某些内容不正确?
答案 0 :(得分:2)
我想你会发现它确实在那里,但你可能无法看到它......
尝试这样的事情:
e = Company.select("companies.*, users.name as user_name").joins(:users)
e.each do |c|
puts "company: #{c.name}, user: #{c.user_name}"
end
输出:
rails runner junk.rb
company: aaaaa, user: user 1
company: bbbbb, user: user 2
company: aaaaa, user: user 3