20170617学习纪录
##Objective
###今天做了什么?
- 写ORID
- 全栈营学习:Rails第三课:Rails101的第六章和部分第七章
- 和广州Meetup的小伙伴们进行购书交流
###关于今天的学习,你记得什么?
####新旧知识
- 关于数据的method是在model里面定义的,并且在view里面又可以使用,比如我们的群成员判断功能。
- 当要定义多对多关系是一定要使用中间表,通过中间表的两个一对多完成多对多功能
- 在完成好了多对多的关联后,还要写清楚多对多的两个量的关系,也就是谁是谁的成员,又是谁加入了谁
- No route matches [GET] “/groups/1/posts/new”,如前面说的,方法+路径。
- 教材题目是设计 Post 的 model 架构,设计model就是设计架构吗?
- routes是定义资源调用地址的,资源需要你写,但写出来要使用的话还要给他们赋予一个地址
- resources :groups do – resources :posts – end就是一种定义地址的方式
- 数据关联是在model里面设置的,action在controller里面也已经有了,view也是匹配的controller,而controller的文件夹,gourps和posts是并列的,所以这个路径地址实际上影响的只是url。
- 数据关联的另一个意义,可能还是在于参数绑定,比如:group和post的id同时获取,那么就是post的id在group的id的名下。
- 命名规则相当于用group_post替代了group
- 另外还有第八个动作PATCH,但它和PUT一样都是update功能。是同名还是同功能?
- 命令git commit -m “add posts nested route”中的,nested意思就是数据关联其实就是巢状链接?nested route的意思是,这个uri了带有关联关系吧?
- :only => [:new, :create]和only: [:new, :create]等效。多参数就加上中括号,若果只有一个参数就不用中括号,其他的一样。
- 在post里@group = Group.find(params[:group_id])的写法是:group_id,而在group里的写法是:id。是否在每个对象里:id默认是自己model的id,而XXX_id则是你要调用的其他model的标准写法?
- 可能在@post.group = @group及@post.user = current_user这类写法里,group和user和group_id和user_id是等效的吧,就像人和身份证号。
- 用group_path(@group)而不用group_posts_path(@group),那是因为前者的页面已经包含了我们的信息,而且这样可以少一个post的index的action。
- @posts = @group.posts表示一旦建立了数据关联,就可以轻松调用。
- method除了是“程序语句”,还可以同时是“功能叙述”。比如,.order(“created_at DESC”)用.recent代替。
- Scope是Rails 里面的一个内建 API可以用来包装一些查询式,让代码更直观一些。你可以想像成,拿来包装“常用 query”的方法。
- scope是在model里面定义,表明controller里面使用的关于数据的方法应该就是model的方法。
- 教材的解释,应征了前面关于model和dababase交互的理解。rails的ActiveRecord框架帮我们完成了翻译,下面一句话摘自教材。
- 教材:“实际上呢,Model 里面的所有语句,看起来是“Ruby 语句”,实际上是 Rails 帮我们“翻译”成为了数据库语句。(这一套叫 ActiveRecord 框架)”
- 不单单是命令窗的指令输入的返回文字有意义,rails s的运行log也有很多有用信息。
- “因为数据库语句也是个“巨坑”,Rails 开发的目的,在于希望程序员专注于“产品”的逻辑设计,而花上少一点时间去纠缠非常底层的细节。在刚开始学习过程中,其实你是不太需要去纠结数据库语句的,大部份你想要捞的数据,ActiveRecord 都能帮你搞定,而且可以“形容”的非常“口语”。”
- 推送上heroku的程序,不需要bundle install,但是需要heroku run rake db:migrate
- 要去哪里才能知道,我想要的功能要用什么 gem 呢?*各种功能的gem一览: “RubyToolbox”
- 涉及到多对多的关系是,就需要建立个中间表,明确完三个表之间的关系后。还要通过命令明确主从关系,比如,教材:“has_many :participated_groups, :through => :group_relationships, :source => :group”和“has_many :members, through: :group_relationships, source: :user”,分别先后在model的user.rb和group.rb里面明确关系。这样当捞 user.participated_groups 时,就会捞出“参与的所有群”。如果只执行上面两句命令中的一句,那么只能捞出members或者participated_groups的。
- 建立联系后,就可以通过activerecord去捞出数据。这个实现了比主从键直接捞数据更复杂的功能。
- “=> #<Group id: 8, title: “Board 1”, description: “Board 1 body”, created_at: “2017-06-17 06:37:08”, updated_at: “2017-06-17 06:37:08”, user_id: 2>”和“ => #<ActiveRecord::Associations::CollectionProxy [#<Group id: 8, title: “Board 1”, description: “Board 1 body”, created_at: “2017-06-17 06:37:08”, updated_at: “2017-06-17 06:37:08”, user_id: 2>]>”的区别在于前者是直接从数据库读出来,后者需要通过ActiveRecord去捞出来。
- 这个与“2.3.1 :004 > g.user — User Load (0.1ms) SELECT “users”.* FROM “users” WHERE “users”.”id” = ? LIMIT ? [[“id”, 2], [“LIMIT”, 1]] – => #<User id: 2, email: “2@qq.com“, created_at: “2017-06-16 13:01:10”, updated_at: “2017-06-16 13:01:10”>”的命令直接捞出的User还不一样,更复杂也更强大。
- “2.3.1 :004 > g.user — User Load (0.1ms) SELECT “users”.* FROM “users” WHERE “users”.”id” = ? LIMIT ? [[“id”, 2], [“LIMIT”, 1]] — => #<User id: 2, email: “2@qq.com“, created_at: “2017-06-16 13:01:10”, updated_at: “2017-06-16 13:01:10”>” 还有 “2.3.1 :005 > g.members — User Load (0.1ms) SELECT “users”.* FROM “users” INNER JOIN “group_relationships” ON “users”.”id” = “group_relationships”.”user_id” WHERE “group_relationships”.”group_id” = ? [[“group_id”, 8]] — => #<ActiveRecord::Associations::CollectionProxy [#<User id: 1, email: “1@qq.com“, created_at: “2017-06-16 12:08:50”, updated_at: “2017-06-16 13:00:39”>]>”
- 关于数据的方法要在model里面定义,教材上的另一种解释:“is_member_of?(group) 为什么这一段要放在 User 的 model 里?因为它是要被 user 所使用的判断式”
- 所以要看对象选择写函数的地方,比如join!和quit!就写在user的model里,因为这个是user要进行的操作,而且是设计到数据库数据的操作。
- 在model的里定义了方法后,还要思考方法启动方式,这个工作是在controller里完成的,如果默认的7个action都不能作为调用途径的话,那么就需要新建另外的action,则需要设置routes和在controller写出对应的action。虽然使用rails console可以使用,但还是要考虑到网站作为面向对象的程序怎么给用户触发的问题。
####遗留问题
- render在Controller里和view里是否一样?
####涉及资源
- 网站:LOGDOWN;
- 网站:全栈营
- 网址:http://localhost:3000/rails/info/routes
- 网址:更多 scope 的用法:http://guides.rubyonrails.org/active_record_querying.html 和之前Rails第二课提供的查class的method的页面是一样的。果然method就是针对针对method的,也就是active_record。
- 网址:要去哪里才能知道,我想要的功能要用什么 gem 呢?*各种功能的gem一览: “RubyToolbox”:https://www.ruby-toolbox.com/
##Interpretive
###我们今天学到了什么?
- rails console本质上其实是不需要view和controller而直接使用函数和对数据进行操作的地方。
- render的意义,在于回到前页,且数据保留不刷新,包括已经填写的表单数据。
- 可以不使用@而直接对数据库操作,比如Group.delete_all
- 在把上面的命令放在@groups = Group.all的下面,在主页依然没有数据,反映两个问题,要么@groups只是指向Group而已,要么程序运行顺序不是按语句从上到下的。
- 学习的速度感很重要,因为写ORID降低了学习的速度感是很不好的一件事情。
- 做事永远比总结重要,不要让总结影响做事的效率,要掌握好度。
- SQL语句可能倒着读能协助理解。
- 遇到程序问题是先想着有没有现场的解决方案,如果没有再分解再找,依次进行下去,最后的结果就是自己解决问题。
###今天有什么重要的领悟?
####编程知识
- 遇到程序问题是先想着有没有现场的解决方案,如果没有再分解再找,依次进行下去,最后的结果就是自己解决问题。
##Reflective
###你要如何形容今天的情绪?
- 写ORID写到有点厌烦,然后就不写了,毕竟心情愉快对坚持学习很重要。
###今天的高峰是什么?
- 加深了对model的理解
###今天的低点是什么?
- 学习过程中容易疲劳,导致总学习时长不长。
##Decisional
###我们会如何用几句话形容今天?
- 上午还行,下午开始感觉没有什么节奏感。
###明天有什么计划?
- ORID
- 全栈营