如何选择具有另一个对象实例的所有对象(has_many和has_one关联)?

时间:2017-05-06 09:25:06

标签: ruby-on-rails activerecord

我有两个模型,用户和课程。

用户has_many课程。 课程has_one用户。

现在我抓住所有用户并在课程索引页面上显示它们,但是,我已经意识到我应该只显示有课程的用户。我不确定该怎么做?

这是来自课程控制器的索引方法:

 #courses_controller.rb

 def index
    @courses = Course.all
    @users = User.all
  end

以下是我的模特:

# user.rb
class User < ApplicationRecord   
  # User has many courses
  has_many :courses, dependent: :destroy
end

# course.rb
class Course < ApplicationRecord
  has_one :user
validates :user_id, presence: true
end

我的架构:

ActiveRecord::Schema.define(version: 20170505114247) do

  create_table "courses", force: :cascade do |t|
    t.string   "name"
    t.string   "prerequisite"
    t.text     "description"
    t.integer  "user_id"
    t.datetime "created_at",   null: false
    t.datetime "updated_at",   null: false
    t.string   "picture"
    t.index ["user_id", "created_at"], name: "index_courses_on_user_id_and_created_at"
    t.index ["user_id"], name: "index_courses_on_user_id"
  end

  create_table "users", force: :cascade do |t|
    t.string   "name"
    t.string   "email"
    t.datetime "created_at",      null: false
    t.datetime "updated_at",      null: false
    t.string   "password_digest"
    t.index ["email"], name: "index_users_on_email", unique: true
  end

end

1 个答案:

答案 0 :(得分:1)

由于用户和课程之间存在一对多关联,因此当您遍历每个课程时,您可以在课程索引页面上包含用户信息。您不需要在控制器中包含@users = User.all。所以你的迭代器可能看起来像这样

在控制器中:

@courses = Course.includes(:user).all  #to avoid n+1 query

您的观点:

# app/views/courses/index.html.erb
<% @courses.each do |course| %>
  <%= course.name %>
  <%= course.description %>
  <%= course.user.name %>
<% end %>
相关问题