【问题标题】:how to use joins query in rails?如何在 Rails 中使用连接查询?
【发布时间】:2018-12-10 07:34:24
【问题描述】:

我有两个模型ClientProject

型号

class Project < ApplicationRecord
    belongs_to :client
end
class Client < ApplicationRecord
    has_many :projects
end

我在 clientsprojects 表中有以下记录:

我想显示带有客户名称的项目记录。我的控制器需要什么查询?

控制器

class ProjectsController < ApplicationController
  def index
    @projects = #your query here
  end
end

【问题讨论】:

  • 您将问题标记为从 3 到 5 的所有 Rails 版本。您实际使用什么版本?
  • 如果 Rails 版本与问题无关,我建议删除所有 Ruby on Rails 版本标签。

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4 ruby-on-rails-5


【解决方案1】:

我认为没有理由使用 JOIN 查询。但我建议使用includes 来避免 N+1 查询。

# in your controller
@projects = Project.includes(:client)

# in your view (simplified – without html tags)
<% @projects.each do |project| %>
  <%= project.name %>
  <%= project.client.client_name %>
<% end %>

【讨论】:

  • 注意: 请记住,如果 client"NoMethodError: undefined method `client_name' for nil:NilClass" /i> 可以是nil。在这种情况下,首先检查 client 是否存在,或使用safe navigation operator (&amp;.)。
【解决方案2】:

我假设您的 rails 版本 > 5

class ProjectsController < ApplicationController
    def index
        @projects = Project.left_outer_joins(:client).select("projects.*, clients.name as client_name").group("projects.id")
    end
end

通过上述查询,您将在单个项目client_name 中获得另一个属性,其中将包含项目的客户名称。如果你想在应用程序级别做你可以用ray的答案,如果你想在数据库级别做,你可以写上面的查询

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多