PENGZhaoqing / CourseSelect

校园选课系统样本 (a template for course selection system by Ruby on Rails)
https://courseselect.herokuapp.com/
MIT License
105 stars 205 forks source link

搜索课程的实现方法 #56

Closed tangmaomao16 closed 7 years ago

tangmaomao16 commented 7 years ago

老师,我看你的选课系统中用管理员身份登录后,可以在搜索框中输入关键信息,然后就可以查找到课程或者用户。我想问,这是怎么实现的?能提供相关介绍的网站或者资料阅读吗?

PENGZhaoqing commented 7 years ago

http://guides.rubyonrails.org/v3.2/active_record_querying.html

http://stackoverflow.com/questions/7051062/whats-the-best-way-to-include-a-like-clause-in-a-rails-query

where方法可以实现精确查找和模糊匹配等

tangmaomao16 commented 7 years ago

老师,你的关于管理员登录后的网页页面的代码文件放在哪里?我找不到。

PENGZhaoqing commented 7 years ago

管理员代码由rails_admin库提供,这个库是直接从gem文件里打包进项目的,如果用C9是看不见的

本地Rubymine可以看见,就在Library里

PENGZhaoqing commented 7 years ago

https://github.com/sferik/rails_admin

源代码倒是可以看见

tangmaomao16 commented 7 years ago

app/controllers/courses_controller.rb文件中的list方法,对应着,app/views/courses/list.html.erb文件吗? 我是指,写了list方法后,Ruby on Rails会自动对应到list.html.erb文件吗? 还是说两者是完全独立的。

tangmaomao16 commented 7 years ago

app/models/course.rb文件内容如下

class Course < ActiveRecord::Base

  has_many :grades
  has_many :users, through: :grades

  belongs_to :teacher, class_name: "User"

  validates :name, :course_type, :course_time, :course_week,
            :class_room, :credit, :teaching_type, :exam_type, presence: true, length: {maximum: 50}

end

问题1:以上是说Course是一个类,对吧?

db/seeds.rb文件中的

course_map={
    1 => {course_code: "091M4001H", name: "计算机体系结构", course_type: "专业核心课", credit: "60/3.0", limit_num: "", course_week: "第2-20周", course_time: "周一(9-11)", class_room: "教1-107", teaching_type: "课堂讲授为主", exam_type: "闭卷笔试"},
    2 => {course_code: "091M4002H", name: "计算机网络", course_type: "专业核心课", credit: "60/3.0", limit_num: "", course_week: "第2-20周  ", course_time: "周五(2-4)", class_room: "教1-107", teaching_type: "课堂讲授为主", exam_type: "闭卷笔试"},
  ...
}

问题2:为什么以上这些数据能传给Course这个类?

app/controllers/courses_controller.rb文件中的list方法中

def list
    @course=Course.all

问题3:程序员在Ruby中定义的类,其实是具体的、实例化的、可操作的一个对象,对吗?比方说,这里的Course这个类,它是一个对象,这个对象是由所有courses组成的一个集合,而这个集合中的元素就是一个个的course。

PENGZhaoqing commented 7 years ago

若在Controller里写了一个list方法,那么rails会默认自动去找视图list.html.erb

若你在list结尾使用一句render "index"指定渲染index.html.erb视图,那么rails会去找index.html.erb文件

tangmaomao16 commented 7 years ago

那list.html.erb这个文件是程序员手动新建的,对吗?

PENGZhaoqing commented 7 years ago

问题1:以上就是一个类,对应的就是courses的数据库表,这个类负责与数据库进行交互

问题2:因为seed后面有相关代码来写入数据

teacher_map.keys.each do |index|
  teacher=User.create!(
      name: teacher_map[index][:name],
      email: "teacher#{index}@test.com",
      department: teacher_map[index][:department],
      password: "password",
      password_confirmation: "password",
      teacher: true
  )

  teacher.teaching_courses.create!(
      course_code: course_map[index][:course_code],
      name: course_map[index][:name],
      course_type: course_map[index][:course_type],
      credit: course_map[index][:credit],
      limit_num: course_map[index][:limit_num],
      course_week: course_map[index][:course_week],
      course_time: course_map[index][:course_time],
      class_room: course_map[index][:class_room],
      teaching_type: course_map[index][:teaching_type],
      exam_type: course_map[index][:exam_type],
  )

end

teacher.teaching_courses.create(...)完成了数据的导入,为啥要这么用,而不直接Course.crerate(...)呢?

因为这个课程是与某个教师关联的,首先找到这个teacher对象,调用teaching_courses转换到这个teacher对应关联的course集合,在这个集合里创建课程,那么这个课程就直接与这个teacher关联了

为啥能用teaching_courses呢?因为在User类里面有一句:

has_many :teaching_courses, class_name: "Course", foreign_key: :teacher_id

这句表明这个teacher对象(由User类实例化)通过:teacher_id关联了课程类,调用teaching_courses可以找到这个teacher对应关联的所有course对象集合

问题3: 在Ruby里,Everything is a object, 虽然Ruby的类也需要实例化才能用(类似java),但是Ruby的类的实现也是靠Object,至于为什么,你可以去看高级软件工程的书,介绍Ruby语言特性那节

你的理解有偏差,不能说Course类由很多course组成,Course就是一个Ruby的类,对这个类调用all类方法(Rails实现?不太确定)能够把这个类中实例化的对象取出来放到一个集合里,是调用了这个all方法才有的效果,并不是本身Course类就是这么构成的

PENGZhaoqing commented 7 years ago

当然是手工创建了,如果使用IDE比如Rubymine有快捷键帮你创建

tangmaomao16 commented 7 years ago

老师,追问一下,在其它程序语言,比如C++,Java中,如果定义了Course类,那能写Course.all这样的语句吗,即直接通过类来调用方法,而无需通过类的一个实例来调用方法?

PENGZhaoqing commented 7 years ago

这种不实例化就能调用的方法叫做类方法,java里叫做静态方法,在调用方法前加static关键字即可。

Ruby里,要在方法前加self.即可成为类方法,如:

class User

  #类方法
  def self.all
      ....
  end

  # 正常实例化才能调用的方法
  def count
     ...
  end
end

C++不太清楚

yuanzhenXu commented 7 years ago

没有显示选课页面,我的课程全是空的

PENGZhaoqing commented 7 years ago

课程为空多半是没有执行seed文件操作...rake db:seed

没有显示选课页面

说的不清楚,给出截图或者相关代码