• 说说 Rails 的套娃缓存机制 at 2014年10月05日

    好文章,看的酣畅淋漓。对于"touch"有一些小comment。

    @rainchen “这个更多是一个view层面render时要顾虑的东西” (要decouple View和Model),引申一下这个观点,我们使用russian-roll caching的时候,我觉得需要了解touch机制的局限,并且尽量把view和model解耦。

    1. 数据库写操作的Scalability 被'touch'的表将有可能变成bottleneck,比如project这个root node,它的读写操作会是子孙node的总和(由于leaf node会populate整个touch chain,所以不单单是child node了)所以,有越多的leaf node加进来,ancestor node就一直被touch,写操作比较难scalable了。当然,读操作的效率很高,因为如果root node没变,就不用touch child node了。

    2. Coupling 数据库table之间的reference关系和view的层次被couple到一起了。一旦view之间的相互关系变了,touch也要相应的改变。而且,数据库里要存foreign key来形成这个touch chain,这些key也许从data modeling的角度都是冗余信息,只是为了view的嵌套方便。

    所以touch适用的范围是,外层大套娃的table轻量,view的结构基本不变,和model有一致的层次关系(view的对应的套娃和model的套娃的套法是相近的)。

    也许楼主的use case就是如此,所以做了那样的design。

  • 关于 defaul order 的使用? at 2014年10月05日

    #7楼 @cqcn1991 不是Rails产生的SQL低效,而是用户要Rails做的操作一定会产生低效的SQL。当你不需要用updated_at来sort的时候,你还是要去Rails去读updated_at的信息,Rails是不可能smart到不用updated_at来sort吧:) 如果你写了default_scope,Rails就一定会去碰updated_at,碰了就是低效。

  • 关于 defaul order 的使用? at 2014年10月05日

    @hooopo 顶。 单单从Database的角度来说,就要避免用default_scope。因为order/where和default scope混到一起后,产生的query有可能非常低效,一个naive的例子,你在hits上有index,created_at上面没有,那你的取sort by hits的query本可以只做B-tree scan,再去取相应的table rows,由于default_scope,现在就必须做一个full table scan(因为created_at需要到table里面取)。

    就算你在created_at上面加了一个index,由于有两个column需要sort,也要消耗额外的内存,做额外的I/O操作。总之,default_scope几乎就是用DB的消耗来换syntax sugar。don't be lazy,把你需要的操作明确地写出来,否则就可能发生你意想不到的事情。

  • @badboy

    你说的情况可能只适用于本地dev环境或者prod环境的测试,因为有对应的数据库产生来临时的schema文件,从而生成in-memory DB。但是如果使用remote build系统,那么远程的host是不会有数据库连接的,那么在build的时候就找不到schema文件,无法进行测试。

    其次,测试用的SqlLite的数据库有一些自己特别的限制,比如index name必须unique。如果由本地数据库(如MySql)产生的schema存在重复的index name,那么SqlLite无法直接读入schema进行测试,每个developer都需要手动来改动schema文件,很浪费时间(发生在身边很多次)。

    再着就是会发生楼主所说的情况,可能migration相互有冲突,无法依次执行migration来建立DB,这时候一个比较简单的办法就是利用schema直接产生没有data的本地数据库。所以,schema文件一般是要check in的。

    @jossjoss54 你是在运行migrate时总遇到table already exist么?要么你们的migration文件不consistent,要么你的本地数据库和远程数据库曾经进行过sync一部分table,但是对应的schema_migrations表没有sync。 有没有办法判断所有的栏位是否相同,若相同则不更新,不同则更新?是什么意思?你想要机器自动判断table是否一致自动运行migration么?

  • 关于 SQL 注入的问题 at 2014年09月28日

    @libuchao 解释的蛮清楚的了。

    比较naive的server端代码本身可能是 SELECT * FROM projects WHERE name = '#{name}' 所以如果你输入的是 "' OR 1 --" (注意single quote不是结束查询,而是和server端的#{name}前面的single quote配对,如果没有single quote,那么所有的注入代码还是被当做string来解析,就无法用--起到注释的作用了)。 替换后: SELECT * FROM projects WHERE name = ' ' OR 1 -- whatever_sql_code

  • @young4u_amy 如果你用错误密码连接DB,那么new的返回值是什么?MySql2的连接错误是抛出exception还是,默默地把client设置成nil?如果是后者的话,那确实捕捉不到exception,因为没抛。

  • @badboy schema不加到代码库里面,那么test文件的in-memory DB 如何产生相应的table structure?

  • @msg7086

    “access_log是个很有用的东西,但是考虑到logrotate和fd的问题,还是不太适合在用户级的应用上使用。” 请教,能否具体阐释一下logrotate和fd(这是什么的缩写?)的问题?

  • 请教一个 SQL at 2014年09月28日

    可以使用IF控制语句。具体语法还要看你使用的是那种数据库。

  • 请问能把您的html, JS, CSS代码粘贴一下么(比如放到http://jsfiddle.net/code,没法子具体分析。)?没有