- 浏览: 2078910 次
- 性别:
- 来自: NYC
文章分类
- 全部博客 (628)
- Linux (53)
- RubyOnRails (294)
- HTML (8)
- 手册指南 (5)
- Mysql (14)
- PHP (3)
- Rails 汇总 (13)
- 读书 (22)
- plugin 插件介绍与应用 (12)
- Flex (2)
- Ruby技巧 (7)
- Gem包介绍 (1)
- javascript Jquery ext prototype (21)
- IT生活 (6)
- 小工具 (4)
- PHP 部署 drupal (1)
- javascript Jquery sort plugin 插件 (2)
- iphone siri ios (1)
- Ruby On Rails (106)
- 编程概念 (1)
- Unit Test (4)
- Ruby 1.9 (24)
- rake (1)
- Postgresql (6)
- ruby (5)
- respond_to? (1)
- method_missing (1)
- git (8)
- Rspec (1)
- ios (1)
- jquery (1)
- Sinatra (1)
最新评论
-
dadadada2x:
user模型里加上 protected def email ...
流行的权限管理 gem devise的定制 -
Sev7en_jun:
shrekting 写道var pattern = /^(0| ...
强悍的ip格式 正则表达式验证 -
jiasanshou:
好文章!!!
RPM包rpmbuild SPEC文件深度说明 -
寻得乐中乐:
link_to其实就是个a标签,使用css控制,添加一个参数: ...
Rails在link_to中加参数 -
aiafei0001:
完全看不懂,不知所然.能表达清楚一点?
"$ is not defined" 的问题怎么办
method_missing经常用来写Ruby的元编程。例如,如果你的UserModel有个email的属性,你就可以通过
respond_to?在实现动态编程中也经常会用到,通常我们在使用respond之前判断是否有respond。
那么我们具体看看实现:
假设我们有Legislator类,我们将实现从find_by_first_name('John') 到find(:first_name => 'John')的动态逻辑
如下:
按照道理来说,这是通过样的逻辑,只是Legislator.respond_to?(:find_by_first_name)会返回false那么我们需要respond_to?来支持。
那么现在有一个问题,就是我们的重复了。这就很不DRY。所以,我们可以和ActiveRecord的学习,看看是怎么处理重复的问题的。实际上ActiveRecord把逻辑封装在了ActiveRecord::DynamicFinderMatch以便不会在method_missing 和respond_to?重复代码
method_missing的缓冲
显然method missing效率不好,那么太多的method missing一定导致很慢。所以另外一个我们可以学习ActiveRecord的地方是我们可以在定义method missing的同时发送到正定义的方法,如下:
测试
创建LegislatorDynamicFinderMatch来测试逻辑,下面是RSpec的例子:
当然,如果你的动态实习需要一些输入的话,很难免你需要用到RSpec,如下:
总之,如果你正在写动态方法你应该考虑respond_to?
User.find_by_email('joe@example.com')来查找,这是如果User并没有定义这个方法,那么ActiveRecord::Base就会处理这样的请求。后面我们会具体分析这过程的逻辑和实现,并学习处理。
respond_to?在实现动态编程中也经常会用到,通常我们在使用respond之前判断是否有respond。
那么我们具体看看实现:
假设我们有Legislator类,我们将实现从find_by_first_name('John') 到find(:first_name => 'John')的动态逻辑
如下:
class Legislator # Pretend this is a real implementation def find(conditions = {}) end # Define on self, since it's a class method def self.method_missing(method_sym, *arguments, &block) # the first argument is a Symbol, so you need to_s it if you want to pattern match if method_sym.to_s =~ /^find_by_(.*)$/ find($1.to_sym => arguments.first) else super end end end
按照道理来说,这是通过样的逻辑,只是Legislator.respond_to?(:find_by_first_name)会返回false那么我们需要respond_to?来支持。
class Legislator # ommitted # It's important to know Object defines respond_to to take two parameters: the method to check, and whether to include private methods # http://www.ruby-doc.org/core/classes/Object.html#M000333 def self.respond_to?(method_sym, include_private = false) if method_sym.to_s =~ /^find_by_(.*)$/ true else super end end end
那么现在有一个问题,就是我们的重复了。这就很不DRY。所以,我们可以和ActiveRecord的学习,看看是怎么处理重复的问题的。实际上ActiveRecord把逻辑封装在了ActiveRecord::DynamicFinderMatch以便不会在method_missing 和respond_to?重复代码
class LegislatorDynamicFinderMatch attr_accessor :attribute def initialize(method_sym) if method_sym.to_s =~ /^find_by_(.*)$/ @attribute = $1.to_sym end end def match? @attribute != nil end end class Legislator def self.method_missing(method_sym, *arguments, &block) match = LegislatorDynamicFinderMatch.new(method_sym) if match.match? find(match.attribute => arguments.first) else super end end def self.respond_to?(method_sym, include_private = false) if LegislatorDynamicFinderMatch.new(method_sym).match? true else super end end end
method_missing的缓冲
显然method missing效率不好,那么太多的method missing一定导致很慢。所以另外一个我们可以学习ActiveRecord的地方是我们可以在定义method missing的同时发送到正定义的方法,如下:
class Legislator def self.method_missing(method_sym, *arguments, &block) match = LegislatorDynamicFinderMatch.new(method_sym) if match.match? define_dynamic_finder(method_sym, match.attribute) send(method_sym, arguments.first) else super end end protected def self.define_dynamic_finder(finder, attribute) class_eval <<-RUBY def self.#{finder}(#{attribute}) # def self.find_by_first_name(first_name) find(:#{attribute} => #{attribute}) # find(:first_name => first_name) end # end RUBY end end
测试
创建LegislatorDynamicFinderMatch来测试逻辑,下面是RSpec的例子:
describe LegislatorDynamicFinderMatch do describe 'find_by_first_name' do before do @match = LegislatorDynamicFinderMatch.new(:find_by_first_name) end it 'should have attribute :first_name' do @match.attribute.should == :first_name end it 'should be a match' do @match.should be_a_match end end describe 'zomg' do before do @match = LegislatorDynamicFinderMatch(:zomg) end it 'should have nil attribute' do @match.attribute.should be_nil end it 'should not be a match' do @match.should_not be_a_match end end end
当然,如果你的动态实习需要一些输入的话,很难免你需要用到RSpec,如下:
describe Legislator, 'dynamic find_by_first_name' do it 'should call find(:first_name => first_name)' do Legislator.should_receive(:find).with(:first_name => 'John') Legislator.find_by_first_name('John') end end
总之,如果你正在写动态方法你应该考虑respond_to?
发表评论
-
Destroying a Postgres DB on Heroku
2013-04-24 10:58 939heroku pg:reset DATABASE -
VIM ctags setup ack
2012-04-17 22:13 3261reference ctags --extra=+f --e ... -
alias_method_chain方法在3.1以后的替代使用方式
2012-02-04 02:14 3302alias_method_chain() 是rails里的一个 ... -
一些快速解决的问题
2012-01-19 12:35 1476问题如下: 引用Could not open library ... -
API service 安全问题
2011-12-04 08:47 1388这是一个长期关注的课题 rest api Service的 ... -
Module方法调用好不好
2011-11-20 01:58 1354以前说,用module给class加singleton方法,和 ... -
一个ajax和rails交互的例子
2011-11-19 01:53 1911首先,这里用了一个,query信息解析的包,如下 https: ... -
Rails 返回hash给javascript
2011-11-19 01:43 2280这是一个特别的,不太正统的需求, 因为,大部分时候,ajax的 ... -
关于Rubymine
2011-11-18 23:21 2270开个帖子收集有关使用上的问题 前一段时间,看到半价就买了。想 ... -
ruby中和javascript中,动态方法的创建
2011-11-18 21:01 1246class Klass def hello(*args) ... -
textmate快捷键 汇总
2011-11-16 07:20 8153TextMate 列编辑模式 按住 Alt 键,用鼠标选择要 ... -
Ruby面试系列六,面试继续面试
2011-11-15 05:55 2031刚才受到打击了,充分报漏了自己基础不扎实,不肯向虎炮等兄弟学习 ... -
说说sharding
2011-11-13 00:53 1502这个东西一面试就有人 ... -
rails面试碎碎念
2011-11-12 23:51 1950面试继续面试 又有问ru ... -
最通常的git push reject 和non-fast forward是因为
2011-11-12 23:29 17228git push To git@github.com:use ... -
Rails 自身的many to many关系 self has_many
2011-11-12 01:43 2741简单点的 #注意外键在person上people: id ... -
Rails 3下的 in place editor edit in place
2011-11-12 01:20 950第一个版本 http://code.google.com/p ... -
Heroku 的诡异问题集合
2011-11-11 07:22 1700开个Post记录,在用heroku过程中的一些诡异问题和要注意 ... -
SCSS 和 SASS 和 HAML 和CoffeeScript
2011-11-07 07:52 12965Asset Pipeline 提供了内建 ... -
Invalid gemspec because of the date format in specification
2011-11-07 02:14 2128又是这个date format的错误。 上次出错忘了,记录下 ...
相关推荐
在Ruby on Rails框架中,ActiveRecord是一个至...在实际开发中,熟练掌握ActiveRecord的使用,可以极大地提高开发效率和代码质量。通过实例练习,你可以更深入地理解其工作原理,更好地利用它来构建复杂的Web应用程序。
activerecord_any_of, MongoId的any_of类似于activerecord的实现 ActiverecordAnyOf,嘿,我想接手?现在,我写的ruby 越来越少,越来越多的golang 。 我将继续维护这个项目,因为有人使用它,( 别担心,我不会让你...
为了确保我们的动态方法不仅能够被调用,还能够在调用前被正确识别,我们需要同时实现`respond_to?`。这有助于提高代码的可读性和可维护性。 #### 四、示例分析 根据给定的部分内容,我们可以看到一个具体的例子: ...
这些许可证规定了代码的使用、修改和分发的条件,鼓励代码共享和社区协作。 7. **测试与规格**: "specs"通常指的是规格测试,例如Scala的ScalaCheck或Specs2,它们用于自动生成测试用例以验证代码的正确性。在本例...
2. 数据访问层接口和实现:定义了如何与数据库交互的接口,以及具体的实现,可能使用了ADO.NET、Entity Framework或其他ORM框架。 3. 业务逻辑层:包含了处理业务规则和数据验证的类或方法。 4. 控制器:ASP.NET MVC...
在.NET开发环境中,ASPX(ASP.NET)是一种用于构建动态网页和Web应用程序的技术。而ActiveRecord是Ruby on Rails框架中的一个重要组件,它提供了一种对象关系映射(ORM)机制,使得开发者可以以面向对象的方式来操作...
activerecord-session_store, 从 Rails 中提取的记录存储的活动会话 Active Record 会话存储由 Active Record 类支持的会话存储。 提供了默认类,但是任何对 Active Record 会话类的对象鸭类型都有文本 session_id ...
身份缓存提取器 用于ActiveRecord#fetch_or_initialize 和 ActiveRecord#fetch_or_create # based on https://github.com/Shopify/identity_cache#secondary-indexesclass Product < ActiveRecord :: Base ...
[其他类别]ActiveRecord简单实例_activerecord.zip源码ASP.NET网站源码打包下载[其他类别]ActiveRecord简单实例_activerecord.zip源码ASP.NET网站源码打包下载[其他类别]ActiveRecord简单实例_activerecord.zip源码...
ActiveRecord :: ImportWithCallbacks 一个使用ActiveRecord和回调批量插入数据的库。安装将此行添加到您的应用程序的Gemfile中: gem 'activerecord-import_with_callbacks' 然后执行: $ bundle或自己安装为: $ ...
这个资料包“使用ActiveRecord验证密码强度_Ruby_下载.zip”可能包含一个实现这种功能的代码库或示例,名字为“password_strength_validator-master”。 ActiveRecord中的验证是通过定义在模型类上的验证方法来实现...
关系注解使用自定义数据注释 ActiveRecord 关系对象,允许关系的元数据可用于自定义代码。安装将此行添加到应用程序的 Gemfile 中: gem 'activerecord-relations_annotations' , '~> 0.0.1' 然后执行: $ bundle...
免责声明:资料部分来源于合法的互联网渠道收集和整理,部分自己学习积累成果,供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者或出版方,资料版权归原作者或出版方所有,...
由于Chris Tonkinson(@cmtonkinson)的工作,Rails 5将具有精细SQL日志记录,因此您可以轻松地在日志中看到SELECT,INSERT,UPDATE,DELETE和transaction语句。 该gem是该彩色日志记录功能的经过测试的反向端口。 ...
Ruby是一种动态、面向对象的编程语言,而ActiveRecord是Ruby on Rails框架中的一个核心组件,它是一个对象关系映射(ORM)系统。ActiveRecord提供了一种简洁的方式将数据库操作与Ruby对象模型化,使得开发者可以方便...
《基于Castle ActiveRecord实现PetShop ASP.NET数据访问层详解》 在.NET开发中,数据访问层(DAL)是应用程序与数据库交互的关键部分。本项目“PetShop_Model_DAL.rar”提供了一个使用Castle ActiveRecord框架构建...
ActiveRecord::JSONValidator使验证变得容易针对JSON 属性。安装将此行添加到应用程序的 Gemfile 中: gem 'activerecord_json_validator' , '~> 2.0.0'用法JSON 架构模式应该是一个 JSON 文件{ " type " : " object...
MyBatisPlus的ActiveRecord实现体现在它的Mapper接口中,如`UserMapper`,提供了丰富的CRUD方法。这些方法由MyBatisPlus动态生成,减少了手动编写SQL的工作量。 6. **地狱门(hellomp)** 文件名`hellomp`可能是指...
ActiveRecord::StrictValidations ActiveRecord::StrictValidations向 ActiveRecord 模型添加验证以确保它们不会触发数据库错误。安装将此行添加到应用程序的 Gemfile 中: gem 'activerecord_strict_validations'...