★尽量养成习惯用bundle exce rails/rake 而不是bin/rails或rails
[!NOTE|label:mysql-get_table_schema] describe tableName;
多對多關連的概念大概就有點像這樣,沒辦法單純的在兩邊的 Model 設定 has_many 或 belongs_to 就搞定,多對多的關連通常會需要一個第三方的資料表來存放這兩邊 Model 的資訊,也就是上面例子裡「挂号记录」的概念。
!> 「多對多」關連,在使用上就跟一般的「一對多」差不多,但實際上的資訊都是記錄在第三方資料表裡。
這裡的 store:references 的寫法會多做幾件事:
- 自動加上索引(index),加快查詢速度。
- 自動幫 Model 加上 belongs_to
可用自带的脚手架scaffold,自动迁移数据库和生成页面/单元测试等
!> 建议试着自己写,去实现脚手架同样CRUD的功能
步骤顺序:
- rails new blog -d mysql && cd blog
- cd blog
- bundle # init "./bundle"
- vi config/database.yml # enter mysql password
- bundle exec rake db:create #【bundle exce】like【npm run】
- bundle exec rails g scaffold students name:string password:string age:integer
可通过rails g migration appname 字段
实现更新表结构/字段
Tip
candidate可首字母大写,不大写生成ruby的类时也会自动大写
- 在config/routes.rb加上 resources :candidates
- rake db:create
- rails generate/destroy controller candidates
- rails generate model candidates name party votes:integer
!> 注意Model的candidate用单数形式
第4.步后会在/db/migrate/里面生成一个 xxx_create_candidates.rb
打开它可加上一些默认值或约束等
-
rails db:migrate
-
touch index/new/edit.html.erb in views/candidates/
-
add "def index\n@candidates = Candidate.all\n end" in candidates_controller.rb
-
add controller.new and new.html.erb
-
rails generate model vote_logs candidate:references ip:string
before_action :set_candidate, :only => [:edit, :update]
类似python的装饰器,这个函数能让后面指定的函数的第一行加上公用函数的内容
def set_candidate
@candidate = Candidate.find params[:id]
end
主要作用是根据ID选中数据库某行并赋值给实例变量,以便进一步修改
render plain: "
"[!TIP|label:string.html_safe] render html: %Q(/candidates).html_safe
render inline: "
"render xxx and return
<%= form_for(@candidates) do |f| %> <%= form_for(@candidate) do |f| %>