grape中使用request.body.string,本地没问题,staging服务器使用passenger报错,request.body对象在不同服务器下不同
https://groups.google.com/forum/#!topic/phusion-passenger/EYbAUYoh5qE
search_field中包含integer_column: activerecord-hackery/ransack#85
sidekiq并发与数据库总连接数
https://github.com/mperham/sidekiq/wiki/Advanced-Options#concurrency
namespace与class同名时,class的const_missing会返回已定义的对象。
warning: toplevel constant ApplicationController referenced by SuperAdmin::ApplicationController
https://groups.google.com/forum/#!topic/rubyonrails-core/urXofuENLss
Placing your callbacks after associations is usually a good practice.
http://api.rubyonrails.org/classes/ActiveRecord/AutosaveAssociation.html
has_many :through
总结
inverse_of
用于在has_many
,has_one
,belongs_to
中自动引用关联对象,即已实例化关联对象,在某些情况下使用关联对象不会再去查找数据库,而是直接使用已实例化的对象。主要用于减少查询。- 使用
has_many through
情况下,若不设置inverse_of
,会出现中间表对象没有引用关联对象的情况,有可能导致中间表记录不创建的情况。 - 在
rails4.2
下,has_many through
为中间表添加inverse_of
发现行为比较奇怪,要根据源码分析,猜测不出实现。
由于rails4.1+
会自动添加inverse_of
,上述1,2点仅在小于4.1版本出现,不过对于某些情况是不会自动添加inverse_of
的。关于inverse_of
的限制(不支持某些设置或关联类型),参考官方文档
参考
https://ruby-china.org/topics/24998 https://www.viget.com/articles/exploring-the-inverse-of-option-on-rails-model-associations
http://www.rubydoc.info/github/rspec/rspec-core/RSpec/Core/Configuration#include-instance_method
http://stackoverflow.com/questions/20955384/how-to-reuse-a-context-in-rspec
注意点
- 在配置
rails_helper.rb
中include
可以通过type
选项指定类型加载。 - 要首先加载文件,如定义在
spec/support
下则需要对该目录下文件进行require
复用测试用例,使用shared examples
https://www.relishapp.com/rspec/rspec-core/v/3-5/docs/example-groups/shared-examples
复用方法或数据定义等(非完整测试),使用shared context
https://www.relishapp.com/rspec/rspec-core/docs/example-groups/shared-context
只用于检查DB中对象是否存在时,通常使用exist?
会有最佳性能
User.exist?
https://semaphoreci.com/blog/2017/03/14/faster-rails-how-to-check-if-a-record-exists.html
构建saas应用的注意要点,感觉基本适用于大部分应用。 可理解为如何提高项目的可维护性
Phusion Passenger Design and Architecture
(总结待补充..)
[20,000 Leagues Under ActiveRecord]http://patshaughnessy.net/2014/9/17/20000-leagues-under-activerecord
- ActiveRecord中的
QueryMethods
一般会返回ActiveRecord::Relation
对象,同时将query的参数存储在对象里,而不会马上执行查询。 - 当调用
FinderMethods
时,ActiveRecord::Relation
对象才会按缓存下来的条件真正执行查询。 - ActiveRecord使用
arel
(一个ruby的AST实现)做sql语句转换
首先理解js的执行环境
Javascript诞生记 JavaScript 运行机制详解:再谈Event Loop Javascript在网页页面加载时的执行顺序
大概就是开发者遇到了js无法模块化导致命名空间混乱,影响加载速度等各种问题....
于是出现了各种打包工具
http://www.ruanyifeng.com/blog/2014/09/package-management.html
打包工具基本是基于这几个种规范的实现
使用token确保客户端用户的身份,从两个方面考虑:
- token的签发与维护策略
- token传输过程的安全性
我认为token传输安全性可以通过协议(如https)确保,而token的策略则是在token泄漏的情况下(在token传输100%安全的情况下这应该是没有意义的,但似乎不可能),如何把危险性降到最低。
参考链接:
http://stackoverflow.com/questions/7030694/why-do-access-tokens-expire
https://auth0.com/blog/ten-things-you-should-know-about-tokens-and-cookies/
https://ruby-china.org/topics/23892 http://brewhouse.io/blog/2014/04/30/gourmet-service-objects.html https://www.netguru.co/blog/service-objects-in-rails-will-help
https://softwareengineering.stackexchange.com/questions/262424/where-does-authorization-fit-in-a-layered-architecture varvet/pundit#212
可以考虑将权限验证放在service层
暂不考虑微服务
https://medium.com/@andriytyurnikov/dissecting-rails-monolith-basics-cc0734934b21 https://apotonick.wordpress.com/2015/09/05/the-only-alternative-to-a-rails-monolith-are-micro-services-bullshit/ https://content.pivotal.io/blog/leave-your-migrations-in-your-rails-engines https://www.embbnux.com/2016/03/15/rails_system_refactor_with_rails_engine/ https://ruby-china.org/topics/28538
定义给include该module的类添加的class_methods
参考源码: https://github.com/rails/rails/blob/master/activesupport/lib/active_support/concern.rb#L134 https://github.com/rails/rails/blob/master/activesupport/lib/active_support/concern.rb#L111
执行class_methods时先定义一个module然后对module进行module_eval 被include的时候基类就会extend这个module
https://gist.github.com/vsavkin/3577292
记录多态类的type必须用STI的基类
http://blog.gejiawen.com/2015/08/11/javascript-float-count-precision/
grape在设计上无法重复mount某个API
https://stackoverflow.com/questions/41518896/why-array-new-is-better-than-times-map-in-rubocop
grape可以自定义Content-Type的parser:https://github.com/ruby-grape/grape#api-data-formats
参考源码,假如由rack识别为表单类型,则直接跳过parser
https://mathiasbynens.be/notes/mysql-utf8mb4 http://mumaren.me/blog/2013/11/27/support-emoji-in-rails-3-dot-2-14/ https://railsmachine.com/articles/2017/05/19/converting-a-rails-database-to-utf8mb4.html https://dev.mysql.com/doc/refman/5.5/en/charset-unicode-conversion.html http://qiita.com/xend/items/4d5c3333cbae53888f37
两种方案:
- varchar(255)改为varchar(191)使索引长度在mysql限制的767bytes内
- 修改数据文件类型使索引长度上限变为3072bytes
https://groups.google.com/forum/embed/#!topic/ruby-grape/-knyB5M6xg4
ActiveSupport重写了Object#to_json,有更多字符会被转义。如:
{ a: 'test&' }.to_json #=> "{\"a\":\"test\\u0026\"}"
JSON.dump({ a: 'test&' }) #=> "{\"a\":\"test&\"}"