Rails宝典七十六式:使用scope_out插件

本文介绍了Rails插件ScopeOut的安装与使用方法。该插件简化了模型中条件筛选的定义过程,提供了多种灵活的查找方式,如find_x、with_x及calculate_x等,并支持动态查找器和组合范围等功能。
[b]安装[/b]
[code]
ruby script/plugin install http://scope-out-rails.googlecode.com/svn/trunk/
[/code]

[b]使用例子[/b]
[code]
# models/task.rb
scope_out :incomplete, :conditions => ['complete=?', false], :order => 'name'

# tasks_controller.rb
@tasks = Task.find_incomplete(:all)


# models/project.rb
has_many :tasks, :extend => Task::AssociationMethods

# projects_controller.rb
def show
@project = Project.find(params[:id])
@tasks = @project.tasks.find_incomplete(:all)
end
[/code]

[b]文档[/b]
[code]
=ScopeOut
Author:: John Andrews
License:: Distributes under the same terms as Ruby
============

==Usage:

class Person < ActiveRecord::Base
scope_out :women, :conditions => ["people.sex = ?", "F"]
end

The above code creates three class methods: find_women, with_women, and calculate_women.
It is equivalent to doing the following:

class Person < ActiveRecord::Base
def Person.with_women
with_scope :find => {:conditions => ['people.sex => ?', "F"]} do
yield
end
end

def Person.find_women(*args)
with_women {find(*args)}
end

def Person.calculate_women(*args)
with_women {calculate(*args)}
end
end

==with_x
Person.with_women acts just like with_scope, except the scope is already defined. For example:

Person.with_women do
Person.find(:all, :order => 'people.age desc')
end

==find_x
Person.find_women acts just like find, except that it is scoped with with_women:

Person.calculate_women(:first, :include => :pets)
# equivalent to Person.find(:first, :conditions => ["people.sex = ?", "F"], :include => :pets)

==calculate_x
Person.calculate_active (you guessed it) is exactly like Person.calculate, but scoped with 'with_women'

Person.calculate_active(:count, :all)
# is the same as Person.calculate(:count, :all, :conditions => ["person.sex = ?", "F"])

==Combined Scopes
You can use the combined_scope method to define a scope which is the combination of two or more scopes that you previously defined with scope_out.

class Ticket
scope_out :active
scope_out :johns_tickets, :conditions => {:assigned_to => 'John'}
combined_scope :todo_for_john, [:active, :johns_tickets]
end

==Association Finders
scope_out also creates a module called AssociationMethods inside the class that defines the scope. Using this, you can extend your associations using the same scopes. Let's define a second class:

class Person < ActiveRecord::Base
has_many :pets, :extend => Pet::AssociationMethods
scope_out :women, :conditions => ["people.sex = ?", "F"]
end

class Pet < ActiveRecord::Base
belongs_to :person
scope_out :cats, :conditions => ["pets.type = ?", "Feline"]
end

woman = Person.find_women(:first)
her_pets = woman.pets
her_cats = woman.pets.cats

# cats is cached on the association, so this doesn't cause another call to the database
# unless you do woman.pets.cats(:reload)
puts "Cat Lady!" if woman.pets.cats.length > 4

==Dynamic Finders
scope_out extends ActiveRecord::Base#method_missing to capture dynamic, scope-based finders.

female_centurions = Person.find_all_women_by_age(100)
scruffy = Pet.find_cats_by_name('Scruffy')

==Flexible Syntax
All of the following define the same scope:

class Ticket
scope_out :active
scope_out :active, :field => 'active', :value => true
scope_out :active, :conditions => ["active = ?", true]
scope_out :active, :conditions => {:active => true} # rails >= 1.2
end

Note: the :field, :value syntax will be deprecated in the near future in favor of the :conditions hash.

==Dynamic Conditions
If you want to use a dynamic condition (which will be evaluated each time the scope is called), you can pass the options hash as a block.

class Person < ActiveRecord::Base
scope_out :adults do
{:conditions => ['people.birthdate < ?', 18.years.ago],
:order => 'people.birthdate asc' }
end
end
[/code]
需求响应动态冰蓄冷系统与需求响应策略的优化研究(Matlab代码实现)内容概要:本文围绕需求响应动态冰蓄冷系统及其优化策略展开研究,结合Matlab代码实现,探讨了在电力需求侧管理背景下,冰蓄冷系统如何通过优化运行策略参与需求响应,以实现削峰填谷、降低用电成本和提升能源利用效率的目标。研究内容包括系统建模、负荷预测、优化算法设计(如智能优化算法)以及多场景仿真验证,重点分析不同需求响应机制下系统的经济性和运行特性,并通过Matlab编程实现模型求解与结果可视化,为实际工程应用提供理论支持和技术路径。; 适合人群:具备一定电力系统、能源工程或自动化背景的研究生、科研人员及从事综合能源系统优化工作的工程师;熟悉Matlab编程且对需求响应、储能优化等领域感兴趣的技术人员。; 使用场景及目标:①用于高校科研中关于冰蓄冷系统与需求响应协同优化的课题研究;②支撑企业开展楼宇能源管理系统、智慧园区调度平台的设计与仿真;③为政策制定者评估需求响应措施的有效性提供量化分析工具。; 阅读建议:建议读者结合文中Matlab代码逐段理解模型构建与算法实现过程,重点关注目标函数设定、约束条件处理及优化结果分析部分,同时可拓展应用其他智能算法进行对比实验,加深对系统优化机制的理解。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值