【问题标题】:rails query for attributes from different tables/modelsrails 查询来自不同表/模型的属性
【发布时间】: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


【解决方案1】:

我想你会发现它确实在那里,但你可能看不到它......

试试这样的:

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

【讨论】:

  • @John,非常感谢。我真的对这个问题感到沮丧。就像你说的那样,我查询的方式没问题,我只是没有意识到在 Rails 控制台中得到的响应并没有真正反映存储在变量中的查询结果......似乎我'仍然处于 Rails 学习曲线的底部。
  • 它只是在rails环境下运行一个脚本@arup
  • @user 之前也遇到过我。由于某种原因,检查忽略了其他列,但它们在那里!
  • 我可以在 rails env 中运行任何.rb 文件吗?
  • 是的,您可以使用它来运行 cron 作业。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多