`
fantaxy025025
  • 浏览: 1329322 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

Rails源码阅读(五)with_scope 和 named_scope

 
阅读更多

Rails源码阅读(四)with_scope and named_scope

 

with_scope的用法

简而言之,with_scope的用法类似于with_options,能够在内层方法调用的时候,插入外层的条件。有点也类似,可以节省代码。with_scope的作用要多于with_options,这个在named_scope中就会看见了。

    这个例子可以看见,外层的查询条件加入了内层的查询条件中,起到了联合查询的目的。

  class Article < ActiveRecord::Base
    def self.find_with_scope
      with_scope(:find => { :conditions => "blog_id = 1", :limit => 1 }, :create => { :blog_id => 1 }) do
        with_scope(:find => { :limit => 10 })
          find(:all) # => SELECT * from articles WHERE blog_id = 1 LIMIT 10
        end
        with_scope(:find => { :conditions => "author_id = 3" })
          find(:all) # => SELECT * from articles WHERE blog_id = 1 AND author_id = 3 LIMIT 1
        end
      end
    end
  end

with_scopde是怎么实现的,代码研究

with_scope的源码比较长,就不粘贴了。

with_scope是个protected方法,实现过程是把参数保存在scope中,等最后查询(find)的时候,再取出scope中保存的条件来,加入find查询的条件中,起到了联合查询的作用。

见find的源码:

        def construct_finder_sql(options)
          scope = scope(:find)
          sql  = "SELECT #{options[:select] || (scope && scope[:select]) || default_select(options[:joins] || (scope && scope[:joins]))} "
          sql << "FROM #{options[:from]  || (scope && scope[:from]) || quoted_table_name} "

          add_joins!(sql, options[:joins], scope)
          add_conditions!(sql, options[:conditions], scope)

          add_group!(sql, options[:group], options[:having], scope)
          add_order!(sql, options[:order], scope)
          add_limit!(sql, options, scope)
          add_lock!(sql, options, scope)

          sql
        end

scope 有个技巧,当前要存入scope的条件存入了当前线程的hash中,并且名字为当前的类名相关。

这个是不是很像Hibernate中使用的ThreadLocal阿~

        def scoped_methods #:nodoc:
          Thread.current[:"#{self}_scoped_methods"] ||= self.default_scoping.dup #self.default_scoping = []
        end

另外注意,scoped_methods不会一直增长下去,而是用完就删除了!

          self.scoped_methods << method_scoping
          begin
            yield #查询
          ensure
            self.scoped_methods.pop #查询完了,就删除了
          end
 

举个例子:

 

class Tag < ActiveRecord::Base
  named_scope :red, :conditions => "id <= 10" do
    def dom_id
      'red_shirts'
    end
  end
  with_scope(:find => {:conditions => "id <= 5"}) do
    with_scope(:find => {:conditions => "id <= 4"}) do #用了两次哦!
      find(:all)
    end
  end
end

 

 这样在使用Tag.red的时候,跟踪下变量:

 

####这个是with_options存储的,可以看见,条件叠加了,都存储了下来

hash={:find=>{:conditions=>"(id <= 5) AND (id <= 4)"}}

####

####scope中存储的

scoped_methods=[{:find=>{:conditions=>"id <= 5"}}, nil]

####

 

 

 

参考:

http://muyu.iteye.com/blog/248400

http://xf986321.iteye.com/blog/413332

 

 

待续

分享到:
评论

相关推荐

    Rails_Recipes_with_Source_Code

    《Rails Recipes with Source Code》是一本专注于Ruby on Rails框架实践技巧和源代码解析的书籍。Rails是基于Ruby语言的Web开发框架,以其“约定优于配置”(Convention over Configuration)的理念和“开发人员的...

    agile_web_development_with_rails_3rd_edition.9994652073.pdf

    《敏捷Web开发与Rails》第三版是一本全面且深入的Ruby on Rails教程,适合那些希望利用敏捷开发原则和Rails框架构建高质量Web应用的开发者阅读。通过学习本书,读者不仅可以掌握Rails的基本操作,还能学会如何运用...

    Agile Web Development with Rails 1-14节_ppt(老师发的修正版)

    Agile Web Development with Rails 1-14节_ppt(老师发的修正版)

    Rails_3_Cheat_Sheets.pdf

    Rails_3_Cheat_Sheets.pdf

    RestFul_Rails_Dev_pdf_v_0.1.zip

    本资料“RestFul_Rails_Dev_pdf_v_0.1.zip”包含了《RESTful Rails Development》的翻译版,将深入探讨如何在Rails中实现RESTful的设计模式。 首先,RESTful设计的核心概念是资源(Resources)。在Rails中,资源...

    rails_admin_acts_as_list:rails_admin插件以对记录进行排序

    介绍插件,用于对记录进行排序(使用 gem)安装要启用rails_admin_acts_as_list,请将以下内容添加到您的Gemfile : gem 'rails_admin_acts_as_list'gem 'rails_admin' 重要提示: rails_admin_acts_as_list之前必须...

    rails_admin_image_manager:RailsAdmin和CKEditor的图像管理器

    RailsAdmin_ImageManager RailsAdmin和CKEditor的图像管理器。...$ rails db:migrate SCOPE=rails_admin_image_manager 安装图像管理器CKEditor插件 mkdir -p app/assets/javascripts/ckeditor && touch app

    rails_api_with_controller

    标题 "rails_api_with_controller" 暗示我们将探讨如何在Ruby on Rails框架中构建一个API,特别是使用Controller来实现。Rails API模式专为创建数据驱动的Web服务而设计,通常用于构建后端服务,供前端应用程序(如...

    Ruby on Rails: the scope method

    ### Ruby on Rails: The Scope Method 在Ruby on Rails框架中,`scope`方法是一个非常强大的工具,用于定义数据库查询的预设条件,从而简化代码并提高可读性和可维护性。下面将详细介绍`scope`方法的基本概念、用法...

    rails_with_webpack_starter_kit:带有Webpack项目入门工具包的Personal Rails

    $ git clone git@github.com:bigardone/rails_with_webpack_starter_kit.git $ bundle install $ npm install -g webpack $ npm install $ rake db:create $ rake db:setup $ foreman start -f Procfile.dev 测试 ...

    rails_6_test_app_with_1_ws_channel

    自述文件该自述文件通常会记录启动和... 您可能要讲的内容: Ruby版本系统依赖配置数据库创建数据库初始化如何运行测试套件服务(作业队列,缓存服务器,搜索引擎等) 部署说明...rails_6_test_app_with_1_ws_channel

    rails_admin_content_builder:使用rails_admin创建内容的简单方法

    gem 'rails_admin_content_builder' 运行生成器并进行迁移 rails g rails_admin_content_builder rake db:migrate 在app / assets / application.scss中添加样式 * = require rails_admin_content_builder 用法 ...

    用于过滤英文脏话的 Rails 插件 gem_Ruby_代码_相关文件_下载

    在Ruby on Rails开发中,有时候我们需要对用户输入的数据进行过滤,特别是处理英文内容时,防止出现不合适的脏话或亵渎性词汇。标题提到的"用于过滤英文脏话的 Rails 插件 gem"正是为了解决这个问题。这个插件允许...

    rails_model_test_hello_world

    自述文件版本和设置$ ruby -vruby 2.6.1p33 (2019-01-30 revision 66950) [x86_64-darwin18]$ rails -... $ rails new rails_model_test_hello_world -T -m ~/rtfb_template.rb$ cd rails_model_test_hello_world$ rail

    rails-exporter-源码.rar

    《Rails Exporter 源码解析》 Rails Exporter 是一个用于 Rails 应用程序的开源工具,主要用于数据导出功能。源码分析将帮助我们深入理解其内部工作原理,以便更好地利用它来优化我们的应用。 一、Rails 框架基础 ...

    从图像 生成 Bootstrap配色方案的 Rails 应用程序_css_ruby_html_代码_下载

    标题中的“从图像生成Bootstrap配色方案的Rails应用程序”是一个基于Ruby on Rails的Web应用,它的主要功能是根据用户上传的图像...对于初学者来说,研究这样的项目源码也是学习Rails、前端开发和色彩理论的好途径。

    Rails101_by_rails4.0

    《Rails101_by_rails4.0》是一本专注于Rails 4.0.0版本和Ruby 2.0.0版本的自学教程书籍,它定位于中文读者,旨在成为学习Rails框架的参考教材。Rails(Ruby on Rails)是一个采用Ruby语言编写的开源Web应用框架,它...

    IkaGame示例。使用 Rails5 ActionCable_ruby_代码_下载

    1. **配置**:Rails5项目需要在`config/cable.yml`中配置ActionCable的连接信息,通常会指向Redis这样的后台队列服务,用于存储和转发消息。 2. **创建Channel**:在`app/channels`目录下,开发者会创建一个或多个...

    awesome-rails-gem-zh_CN, Rails 常用 Gem 列表 - Awesome Rails Gem 中文版.zip

    Rails,全称Ruby on Rails,是一款基于Ruby语言的开源Web应用程序框架,以其“Don't Repeat Yourself”(DRY)和“Convention over Configuration”(CoC)的原则,深受开发者喜爱。Awesome Rails Gem 是一个广泛...

    rails_admin_become_user:以设计用户身份登录的 Rails Admin 插件

    Rails 管理员成为用户 ... rails_admin_become_user必须在rails_admin之后rails_admin才能正常工作。 在您的config/initializers/rails_admin.rb初始化程序中添加配置: RailsAdmin . config do | config |

Global site tag (gtag.js) - Google Analytics