【问题标题】:Rails 4 Active Record Joins and Includes not workingRails 4 Active Record 加入和包含不起作用
【发布时间】:2014-05-20 21:35:22
【问题描述】:

我有两个模型:Place 和 Subfilter

class Place < ActiveRecord::Base
  belongs_to :subfilter
end

class Subfilter < ActiveRecord::Base
  has_many :places
end

以下两个查询返回与Place.all相同的值

  1. Place.joins(:subfilter)
  2. Place.includes(:subfilter)

帮助!如果您需要更多信息,请告诉我。

【问题讨论】:

  • 我不知道您期望它是什么...Place.includes(:subfilter).where(subfilter: { name: 'Subfilter #1' }) 将获得与名为 `Subfilter #1' 的子过滤器关联的地方。

标签: ruby-on-rails activerecord join ruby-on-rails-4 model-associations


【解决方案1】:

它应该产生相同的结果,但是这两个语句做的事情并不完全相同。

Place.joins(:subfilter)

产生以下 SQL

SELECT places.* FROM places INNER JOIN subfilters ON subfilters.place_id = places.id

Place.includes(:subfilter)

产生 2 个 SQL 语句

SELECT places.* FROM places

与

SELECT subfilters.* FROM subfilters

include 有助于急切加载,也就是说,如果你想遍历地方,例如

@places.each do |place|
   puts place.subfilter.name
end

您可以在加入表格和预加载下阅读更多相关信息。 http://guides.rubyonrails.org/active_record_querying.html#joining-tables

【讨论】:

  • 嗨冰人,感谢您的意见。如果我想要一个每行包含 Place 及其子过滤器的所有变量的表,你知道我需要做什么吗?例如姓名 |纬度 |液化天然气 |标题(其中标题是子过滤器标题)。谢谢!
  • 你可以随时求助Place.find_by_sql("select *.all you need from places inner join subfilters on places.id = subfilters.place_id") 我真的建议你阅读这个指南,它包含了很好的信息guides.rubyonrails.org/…
  • Place.joins(:subfilter) 生成 INNER JOIN 而不是 LEFT OUTER JOIN api.rubyonrails.org/classes/ActiveRecord/…
  • @Octopus-Paul 很好,从错误的地方复制,已更正。
猜你喜欢
  • 2012-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-27
  • 1970-01-01
相关资源
最近更新 更多