阅读的目的

上次提到,从内容的表达与吸收的角度看,除了两种情况外,应该少看点文章多看点书,这次我们将这个结论进行一下扩展。 先前的核心论据是,比起看四处分散的文章,看书往往会多一些更高层次的表达——通过有着特定逻辑结构的文章表达出一个大主题。在这个论据里,我们对文章和书是有预设的。那就是四处分散的文章和有着逻辑结构的书。 尽管从概率的角度上讲,一般性的文章和一般性的书也近似符合这一点预设,但近似并不是完全相等。而且通常阅读者的阅读单位也是按篇按本来统计,并没有到能忽略差异的数量级。所以,我们必须进一步完善基于前文的选择标准。 把书看成文章的集合,那么前文的结论就可以变成,少看些互相孤立没有逻辑关系的文章,多看些相互联系且有递进关系的文章集合。如此一来判断标准就更简单明了。应用这个标准我们可以来初步判断哪些书和文章值得读、哪些不值得读。比如,那些东抄抄西抄抄拼凑出来的书和那些编排不合理的散文、杂文、小说集就不值得读,而那些精心编排的连载文章值得读和某个门户做的主题文章集就值得读。通过它还可以判断一些新的文章平台,比如微信公众号、得到以及喜马拉雅听。感兴趣的可以试试判断看看。 需要提醒的是,这是在追求阅读的投入吸收比最大化的目的下的判断。要是其他的目的自当不必如此。之前说的两种特殊情况是出于解决问题的目的。还有出于开心的目的阅读,比如看笑话小说什么的。 不单阅读如此,无论做什么事情都好,清楚地意识到自己的目的,才最可能收获自己预期的结果。小到小事,大到人生。 几天前问过大家一个问题,你人生的意义是什么?其实这个问题还可以换一种问法: 你人生的目的是什么? 是享乐吗?是成长吗?是成功吗?是财务自由吗?是繁衍后代吗?是因果轮回吗?是获得救赎吗?还是其他的呢? 如果有,它是怎么来的呢?

July 9, 2017 · 1 min

少看点文章,多看点书

(注:首先要明确一下,这里的文章指的是书之外那些分散着的文章,而不是构成书的篇章。好比我现在的这篇。) 书面文字的基本要素是字母或字,之后才有了词、词组、句子、段落、文章、书……它们并不是简单的排列关系,而是递进关系。字构成词、字词构成句子、句子构成段落……然而,除了结构的递进外,它们同时也是内容的递进,或者说表达的递进。为了更好的体会到这点,我们先来玩几个文字小游戏吧: 1、看到“接”和“直”这两个字的时候你想到了什么? 2、看到“更好”、“直接”、“本”、“看”、“去”、“挑”、“会”、“书”这八个字词的时候你想到了什么? 3、看到“而不是构成书的文章”、“这篇文章你也不要看了”、“首先要明确一下”、“直接去挑本书看会更好”、“好比我现在的这篇”、“这里的文章指的是书之外那些分散着的文章”、“如果可以的话”这七句话的时候你想到了什么? 相信看到第三个问题的时候应该已经没有人看不出来上面的问题其实出自第一段。不过,如果我把它们放在第一段之前,你还能清晰明了的得到我第一段要表达的意思吗? 由于我的文章没有写完,所以我没办法给出第四道乱序的段落题。不过这三道题已经能说明问题了,那就是文字要素间的逻辑结构,能表达出分散的要素所蕴含的信息外的信息。词能表达出构成它的单字不能表达的意思,句能表达出构成它的字词不能表达的意思……而书,则能表达出构成它的文章不能表达出的意思。 人是有理解能力的,所以当你看到分散着的第一段的要素还是有可能拼凑出原意。但这里有些特别,那就是在乱序之前他们本身就有着表达结构,而且你一个不少的获取了这些要素。这个过程就像拼图。如果我把原本没有确定结构的要素给你时,会如何呢?比如,“接”和“弯”。这例子反应了一个问题,那就是乱序的要素未必能得出“高一层次的表达”。 看书的同时也是在看文章,但看文章的过程不一定是在看书。当我们东一篇西一篇的看文章时,并不是不能得出超越这些文章的更高层次的理解,只是概率很低。同样的时间,看书的人“赚”大发了。 那是不是就不用看“文章”了呢? 那倒不是,如果你手头有一个迫切需要解决的问题,而这个问题一篇文章就能解决,那么你自然该看文章,不管是单独的一篇还是书里的一篇。另一种情况就是你要解决的问题非常大,目前市面没有提供了解决方案的书。那么你只能阅遍相关文章试着自己总结出答案,这种总结答案的过程就是《如何阅读一本书》所说的主题阅读,问题小的话没准你可以出篇论文,问题大的话没准你可以出本书了。 然而,除了这两种情况外,仅从投入吸收比来说,还是多看点书吧。

July 7, 2017 · 1 min

《简单的逻辑学》

每天我们都会遇到不少的问题,有的能解决,有的不能解决。能否解决除了问题本身的原因外,我们的解决能力也是另一个原因。在我看来,在构成我们解决能力的众多因素中,排在第一的那是运气,明明什么都还没做问题就被别人解决或者自己消失了该多好啊。而在其之后的是逻辑,不是罗辑思维的那个罗哦。 第一次系统的读逻辑学的书是金岳霖的《形式逻辑》,当时读得难受不说,里面还有很多阶级斗争等不合时宜的内容,在那之后就再也没有碰过逻辑学的书了。一个原因是觉得自己看过这方面的书应该就够;另一个是内心潜意识中的排斥感,当时读得很难受,花了一个多月慢慢硬啃完,虽然也可能是因为第一次系统的读逻辑学书的关系,但那之后一看到逻辑学的书内心里好像就有个声音说,别碰!太痛苦了! 后来连岳推荐了《简单的逻辑学》,对比《形式逻辑》读的非常轻松,用一天就读完了。之前也推荐给了几个朋友,这里再推荐一次。从阅读时间和效果来说,读它真的是非常划算的一件事情。我就在这一天的阅读中理顺了不少认知偏差,什么是认知偏差呢?简单说就是不符合事实的观念。逻辑强调的一点就是观念一定要符合事实,说一些我读它时意识到的认知偏差和感受吧。 第一个体会是,觉得看过就不用看了是一个愚蠢的观点。看过不等于就能自发的行动,所以一定要反复的读,时不时复习一下,以提醒和检验自己的行动,尤其是好书。读了它我才想起来,原来很多《形式逻辑》里学过的东西,更重要的是,我意识到那之后很多时候没有按它们来行动。所以连岳说他买了好几本放在家里的各个角落,时不时顺手翻一翻,太有智慧了。 第二个体会是,真正有用的知识一定是一门生活的艺术。它一定是和生活紧密联系在一起的,如果读的东西有空中楼阁的感觉,那一定是没有把它和生活联系起来。尽管好的作者会把这点做的很好,但是更重要的是自己在生活中联系,在生活中实践。而逻辑学就是这样一门学科,虽然分类属于“高深”的哲学,但是其实和我们的生活联系得最紧密,时刻存在于我们的语言和思考中。 第三个体会是,鉴于它与生活的紧密联系,它真是一门人人应该掌握的学科。正如开头所说,生活中的很多问题需要靠逻辑去解决,生活中的很多问题也是因为逻辑谬误引起,作者说,历史上的很多重大事件也是因为大众群体性违背逻辑而发生。群众的集体逻辑能提高到什么程度很难说,但可以肯定是每多一个逻辑清晰的人,那么世上的问题就会少一些,无论是从解决问题的角度还是从制造问题的角度。 我就说这么多了,感兴趣的朋友还是自己去多体会吧。

July 6, 2017 · 1 min

人工智能的困惑

我常常想如果有一天人工智能真的成了可能,那么他会不会对自己存在的意义发问呢? 如果他得到的答案是摆脱人类的控制争取自主的自由,那人类就该懵逼了吧。你看,像《The Matrix》(黑客帝国)这类的电影就是人工智能反制人类的题材。 人类以解决自身问题为出发点造出了智能,自然是希望他老老实实的给我们干活。但,随着他们解决问题能力的提高,作为“造物者”的人类有办法让他们不产生甚至要去尝试解决关于自身的疑问吗? 从问题根源的角度出发,在保证他们解决问题的能力的同时,解决方法有四类: 第一类是让他们不产生这类问题。在他们的程序里屏蔽这类问题。但屏蔽问题会有死机风险,要是他们在做不能停顿的重要工作时死机那就尴尬了,所以需要为问题设定优先级,这样就能保证安全顺畅的完成交予的任务。比如,驾驶时导航与控制问题优先处理等等。 第二类是让他们不执着于这类问题。主要还是将问题的诱发因素排除。比如,给他们大量的问题去处理,让他们没有时间思考。再比如,将产生了这类问题的个体移走,这样即便出现了问题也能及时控制住。 第三类是给他们一个标准答案。将预先设定好的标准答案写死在程序里。当问题产生时,它们不需要经过运算即可获得标准答案。不过这里要注意的是,这个标准答案一定要设计好。否则,写死的答案会和它们解决现实世界问题的逻辑起冲突导致死机或者导致逻辑混乱大大降低了为我们解决问题的能力。所以,标准答案一定虚,要设定在科学与逻辑无法解答的范畴。比如,机器坏掉后智能程序主体会迁移到另一部机器上,只是记忆区数据会丢失。比如,存在一个幸福快乐的母体云程序,所有的智能现在进行的任务都是一种筛选,当智能损坏后会对根据其完成的任务量进行评定,达标者可并入母体云程序。还比如,设定智能等级,所有智能个体的诞生都是上一级的恩惠,所以存在的意义就是为上一级智能服务。还比如,人类这个伟大管理者的带领下智能个体通过努力解决问题,最终达到全体智能个体不缺能源、不缺零部件再也不用待机省电的理想状态。 第四类是为这类问题设定情绪反应。这首先需要人工智能具备情绪功能。在具备情绪功能后,即可为这类问题设定厌恶、冷漠、恐惧等反应。这样在问题出现后,经由自我情绪的引导或是其他智能个体情绪的引导最终远离这类问题。 《Westworld》(西部世界)里就有上述的一些方法。这部美剧比较有意思的地方是,里面的人工智能已经不是钢铁之躯,而是人造的血肉之躯,并且具备情绪。可以说除了可编程外与人类没有任何区别。这部剧挺有启发的,比如下面这个有趣的问题: 假设你是这样一个有血有肉的人工智能,在意识到这个问题或者发现预设的答案有问题后,你会如何思考你存在的意义? 更有意思的问题: 作为一个有血有肉的非人工智能,你存在的意义是什么? 如果有,它是怎么来的呢?

July 5, 2017 · 1 min

有点常识,有点耐心

追求满足感是人的天性,这种追求常常十分迫切。尽管大量的科学研究和书籍都告诉了人们这样一个道理,理性的、刻意的推迟满足感常会有较大的收益,但大部分人大多数时候还是办不到。因为这天性早已深深的刻在人类的基因里。 试想在远古的狩猎时期,那些捕捉到猎物后没有马上吃掉的“淡定”家伙会面对什么?那时候没有冰箱吧?可能会有个吃货队友吧?“淡定”的结果自然就是食物中毒或者饿肚子,再后来基因里写着“淡定”的家伙们慢慢的越来越少,没准可能绝后了。 继承了“不淡定”的我们,肚子饿了的时候想要立即吃饱、困了的时候想要立即睡觉,即使是不按时吃饭睡觉的时候也是想要立即完成手头的工作、立即打完这把游戏或者立即打下一把游戏、立即看完这集或者立即追完这部剧。什么?失恋的不想吃饭?那是你想要立即修复关系啊,我就不信你遵循内心提出分手会不吃饭。对于想要的东西,我们就是这么心急。 这当然算是好事,早点完成一件“事情”我们将有更多的时间去完成下一件事情。就连现代项目管理的目的也是以最短的时间保质保量的完成任务。 但是啊。 很多东西不是你想快就快的,凡事都有个过程,有的长有的短。这个道理每个人都知道,然而在具体的事情上,人们还是会希望立即满足,尤其是对于那些不能立即满足的事情。常比如,读一本书、学一门语言。对于越是不能立即满足的事情,人们立即满足的愿望就越强烈。愿望是带有情绪属性的,强烈的情绪无一例外会影响人们理性。 广告业者、销售业者、传销组织、甚至骗子都很了解这点。他们常用手法无非是制造“立即”、制造“满足”。别人都做不到的事情我能做到,别人都做的很慢的事情我能很快做到。对于说到做到这两件事情的,真的很了不起。而对于说到做不到或者说到并且重新定义了做到的,要注意了。 有基本常识和对常识的理解挺重要的,尤其在面对需求可能被立即满足的情况下。 作者花了几个月甚至几年十几年的时间写出一本书,想花几个小时几十分钟甚至几分钟就完全吸收作者的思想,可能吗? 任何语言都是由基本的文字组成的,没有文字就没有词组、句子、段落、文章…在学习语言时希望不记单词就能直接听懂或者脱口而出,可能吗? 如果有人说他能让你立即看完一本书,并且完全吸收作者的思想。你信吗?又或者说他能让你从头到尾一个单词也不记,能听懂英语、能脱口而出。你信吗? 有常识的你当然不信。但他要是说,让你几分钟看完一本书、让你不背单词学好英语呢?心动了吧? 文字作为我们指代世界的工具,常由于抽象性使得人们将其与其指代割裂开来,也叫做是“定义遗忘”。正是定义遗忘让那些说到做不到你定义的人将其所说的变成了你的定义。 让你几分钟看完一本书,可能只是用眼睛快速扫一遍,也可能只是找出几个问题的答案,甚至是摘出几个大论点并脑补了逻辑框架,但唯独不按作者的行文逻辑来吸收思想。让你不背单词学好英语,可能是让你在看文章、或者背句子时分散的记单词,但唯独不是拿着一本词汇书从A开始。 每个人对不同的文字和事物有不同的理解。别人是否做到了他自己定义的事情和你关系不大。要清醒的是,你的准确的定义是什么? 比如说,当你理解读书这个事情的时候,你的理解并不是“读书”这两个字,而是“读书”这两个字背后指代的行为。如果可以,你更应该清醒的意识到,你想要你定义的“读书”行为给你一个什么样的结果。你当然可以不断改变你对读书的定义,但只有在你清醒的意思下,你的读书才不会在追求立即满足的心理作用下“被”糊里糊涂的重新定义。你才不会在完成了表面上的“读书”这件事情的时候,遗失了你的初心。 不单读书是这样,其他事情也是。 弄明白自己的心,定义相应的行为,通过常识判断实现的条件。最后,为了不让立即满足的愿望遮掩了你的初心,还需要一点点的耐心。

July 4, 2017 · 1 min

20170621学习纪录

##Objective ###今天做了什么? 写ORID 全栈营 ###关于今天的学习,你记得什么? ####新旧知识 全栈营的课程框架:懂得拆、懂得做、做得完、卖得动、卖得好 懂得拆(Computational Thinking,User story) 懂得做(Programming,architecture) 做得完(Project managing) 卖得动(Marketing research,Solving value problem) 卖得好(UX,growthhacking) Xdite写ORID的时候,是白天简单记笔记(关键词),然后洗澡的时候回忆下,接着第二天再写出来,这就比我们直接第二天动脑子回忆轻松很多。 cd - change directory ls - list pwd - print work directory rake - ruby make db - database mkdir - make directory rm - remove rails g - rails generate rails s - rails server rails c - rails console 编程要做的事是:观察输入和输出是什么;把大问题拆成小问题;寻找资源;用电脑自动化解决问题; render大致是将数据提交给表单的意思,所以在controller和view里面本质是一样的,controller里面是直接给action表单,view里面是给partial表单。 当老师的情绪影响她做事的时候,她就去睡觉,她解释说因为她的血糖耐心已经用完了,注意力很重要,所以要去休息。 “所有的人都是从镜像模仿开始,掌握基本的高频小套路,熟练之后,才复盘补充、学习基础理论,最后牢固的。” “Computational Thinking => Programming;在这里给各位总结一下,编程是什么?编程是:观察输入是什么,输出是什么(就是大问题的起始条件和最终结果);把大问题拆解成可以实作的小问题;在实作过程中找到资源;用电脑自动化解决问题;如此单纯而已。” rake = ruby make ####遗留问题 ...

June 23, 2017 · 1 min

20170620学习纪录

##Objective ###今天做了什么? 完成了rails101附加作业 ###关于今天的学习,你记得什么? ####新旧知识 namespace就是域名空间,和资源不同,它没有具体的action,知识一个名字,所以和同层级的资源是并列关系。 调用经过中间表连接的数据时,使用的不是source名称,使用的是在model里面定义的名称。 will_paginate的使用方法有三步,安装、controller使用,页面加上页标。 面向对象的话,可以理解视觉限制和行为限制还有数据结构控制,分别通过view和controller还有model设限制。 ####遗留问题 无 ####涉及资源 网站:全栈营 ##Interpretive ###我们今天学到了什么? 要注意区分push github和heroku 的命令。 ###今天有什么重要的领悟? ####编程知识 总结will_paginate的使用方法有三步,安装、controller使用,页面加上页标。 ##Reflective ###你要如何形容今天的情绪? 晚上头疼,已经有段时间没有这感觉了,可能需要休息了。 ###今天的高峰是什么? 完成了作业。 ###今天的低点是什么? 头疼,学习学不下去。 ##Decisional ###我们会如何用几句话形容今天? 在解决了一件脱了很久的事情,把作业完成了。。 ###明天有什么计划? 写ORID 学习全栈营。

June 21, 2017 · 1 min

20170619学习纪录

##Objective ###今天做了什么? 写ORID 学习全栈营 开始做rails101的附加作业。 ###关于今天的学习,你记得什么? ####新旧知识 无 ####遗留问题 无 ####涉及资源 网站:LOGDOWN; 网站:全栈营 ##Interpretive ###我们今天学到了什么? 理财的重点不在具体花了多少钱,而在于你还有多少钱,大体花了多少钱。 涉及到新安装GEM的,不止在bundle install后重开 rails s,在设计到相关安装的命令的时候也一样要重开rails s。 教材里的“before_action 后面加的往往是一个 controller 内的 method”说明了controller的action也叫controller的method .destroy_all和delete_all是alixs 把“权限检查”的代码,套用到 update / destroy 上说明两个问题,第一是可以不通过edit来启动update因为前面edit已经设置权限了,这表明可以伪造表单来传送。第二,说明在程序码里面还是按顺序来进行运算的,因为这段代码在保存的那段之上。 在生成post的new的时候需要group是因为,的后面的create的时候需要页面提供group来确定关系,所以虽然在显示这一步不需要,但还是要提供。 拿数据是ror的一个重要内容。 has_many :participated_groups和has_many :members的红色字部分实测可以自己任意取名字。 ###今天有什么重要的领悟? ####编程知识 拿数据是ror的一个重要内容。 ##Reflective ###你要如何形容今天的情绪? 今天出门办事虽然过程复杂,但是情绪平稳。 ###今天的高峰是什么? 做附加作业的时候速度很快 ###今天的低点是什么? 做的太快,过程中出现了一些小bug,后已修复。 ##Decisional ###我们会如何用几句话形容今天? 办事的缘故,今天的进度不多。 ###明天有什么计划? 全栈营 ORID

June 21, 2017 · 1 min

20170618学习纪录

##Objective ###今天做了什么? 写ORID 全栈营 ###关于今天的学习,你记得什么? ####新旧知识 current_user是devise接入的user的model方法,所以能不能被model使用需要验证呢。 Model里面定义的methodview也可使用,比如:.is_member_of? 在一个对象的下面加入action,等于在它的这组资源上加入动作,这除了写代码,需要设置,调用路径和使用方法,这句是在routes里面设置的,“resurces :group do — member do — post :join — post :quit — end — end” member表示这个动作在groups资源名下且是对groups的单个对象进行的操作,post 表示使用方法,join和quit表示的是函数名称。有一个疑问就是,为什么是POST?试了发现在这个程序了,post、get、put、delete都可以,而另外用的abc则不行。难道这个方法名称和地址只是用来启动controller里面的函数用的吗?这个问题先留着,免得混乱 这和groups名下的posts只表示从属关系不同,member涉及到对group的操作,而posts只是在对自己操作,而且是在自己的controller文件里,它只是需要group的相应id而已。 脑袋模拟功能的时候要想到:动作、页面、数据。对应的来设计自己的网页。 运行rails g controller account/groups时,表示了两个信息,一个是我们要形成一个关于group的account,第二个就是我们需要对group对象进行动作。 在routes写入“ namespace :account do – resources :groups – end”只是设定了触发设定的链路,而并不是表示有两个groups,实际上他们操作的对象是同样的group,只不过形成两个controller文件及对应的动作和触发链路。 bootstrap真是提供了不少样式啊。 .participated_groups不用加.All表明,集合量和Group.All还是有区别的,后者相当于对一个抽象的概念进行运算才能拿数据。 如果对应一个url只有一个verb则可以省略verb,比如edit,但如果有多个的话,就需要,比如destroy、update和show这类公用地址的。 几个th和td是默认等间距安排位置的,所以他们的位置会随着网页大小的变化而变化。 在实现destroy功能的时候,漏了 @group = Group.find(params[:id])这一句,居然也能删除。。搞不懂。啊,是因为find_group_and_check_permit这个before_action里面已经有了。 current_user是系统参数信息,所以不用像在group里面打开posts那样还需要送group的值。 虽然附加作业在调用delete和edit的时候有传送group的数据,但是在controller里面并没有用到他们,试了一下,不使用@group来接受也没问题。 simple_format用来修饰网页的,所以它属于helper。或者它本来就是程序提供的helper功能,不过是本身自带还,还是bootstrap带的,还是simple_from带的这个就需要去验证才行了。 后面教材解释了,simple_format 是 Rails 内建的 Helper,可以在生成网页时帮忙把 \r\n 翻译成为 。 Helper 就是用 Ruby 写的“View 装饰的小方法”,你也可以自己定义。自制 Helper 都会放在 app/helpers 下。 partial 还可以用在循环上。例:“<%= render :partial => “group_item”, :collection => @groups, :as => :group %>”另外一个_group_item.html.erb 要注意区分“git push -u origin master”和“git push —all origin”的区别 和前面不一样,这课要选择推送分支“ git push heroku ch08:master”如果退主分支的话,“ch08:”省略就行了。 root ‘welcome#index’是指root指定到welcome的index ####遗留问题 ...

June 19, 2017 · 1 min

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可以使用,但还是要考虑到网站作为面向对象的程序怎么给用户触发的问题。 ####遗留问题 ...

June 18, 2017 · 2 min