UPDATE
我错误地检查了edgerails指南而不是当前正确的Rails 3指南(没有提到after_initialize).不确定为什么edgerails指南是"不正确的" - 我认为edgerails指南应该是最新的最新指南?
我要离开这个问题,以防万一有人来寻找同样的"问题".
宏观式呼叫after_initialize是要走的路.
应该after_initialize用作方法还是宏观式调用?
这有效,但给出了弃用警告:
def after_initialize
logger.info "Called after_initialize"
end
Run Code Online (Sandbox Code Playgroud)
弃用警告:不推荐使用Base#after_initialize,请改用Base.after_initialize:方法.
这有效,并且没有警告:
after_initialize :do_this_after_initialize
def do_this_after_initialize
logger.info "Called after_initialize"
end
Run Code Online (Sandbox Code Playgroud)
但活动记录验证和回调指南在10.4 after_initialize和after_find说:
...如果您尝试使用宏样式类方法注册after_initialize或after_find,它们将被忽略.此行为是由于性能原因,因为after_initialize和after_find都将为数据库中找到的每条记录调用,这大大减慢了查询...
那么这意味着宏方式的使用效率低于方法式方式?
(我猜指南错了,'cos代码为王:D)
一个提交这里从2011年1月28日表明,正确的方法是仍然使用宏风格的通话,而不是一个def after_initialize.
演示(我期待结果[3]):
[1,2] - [1,2,3] => [] # Hmm
[1,2,3] - [1,2] => [3] # I see
a = [1,2].to_set => #<Set: {1, 2}>
b = [1,2,3].to_set => #<Set: {1, 2, 3}>
a - b => #<Set: {}> WTF!
Run Code Online (Sandbox Code Playgroud)
和:
[1,2,9] - [1,2,3] => [9] # Hmm. Would like [[9],[3]]
Run Code Online (Sandbox Code Playgroud)
无论输入顺序如何,如何执行真正的设定差异?
PS.另外,我需要为两个2000元素数组执行此操作.通常,数组#1的元素数量少于数组#2,但这不能保证.
我有一个新的rails 3应用程序,这是我的Gemfile:
source 'http://rubygems.org'
gem 'rails', '3.0.0' gem 'delayed_job'
gem 'sqlite3-ruby', :require => 'sqlite3'
Run Code Online (Sandbox Code Playgroud)
这是表示我想要排队的作业的类:
class Me < Struct.new(:something)
def perform
puts "Hello from me"
logger.info "Hello from me"
logger.debug "Hello from me"
raise Exception.new
end
end
Run Code Online (Sandbox Code Playgroud)
从没有工作人员运行的控制台:
irb(main):002:0> Delayed::Job.enqueue Me.new(1)
=> #<Delayed::Backend::ActiveRecord::Job id: 7, priority: 0, attempts: 0, handler: "--- !ruby/struct:Me \nsomething: 1\n", last_error: nil, run_at: "2010-12-29 07:24:11", locked_at: nil, failed_at: nil, locked_by: nil, created_at: "2010-12-29 07:24:11", updated_at: "2010-12-29 07:24:11">
Run Code Online (Sandbox Code Playgroud)
就像我提到的:没有工人在运行:
irb(main):003:0> Delayed::Job.all
=> [#<Delayed::Backend::ActiveRecord::Job id: 7, priority: 0, …Run Code Online (Sandbox Code Playgroud) 搜索'net,我发现我应该使用:include,但这似乎不会改变生成的SQL查询:
def Post #model
default_scope :order => 'created_at DESC', :include => :author
end
Run Code Online (Sandbox Code Playgroud)
无论有没有:include,SQL都是一样的(即它只从posts表中选择).
这样做的方法是什么?
我正在使用Devise for rails 3应用程序.对于页面缓存,我需要为登录/注销信息设置cookie.
使用Devise登录/注销时设置cookie的最简单方法是什么?我读了"如何自定义控制器"部分,但它似乎是很多工作.
我正在尝试从AREL获取SQL,但是在我使用的情况下它不起作用average(:stars):
这有效:
Review.where("reviewed_user_id = ?", self.reviewed_user_id).to_sql
#=> "SELECT `reviews`.* FROM `reviews` WHERE (reviewed_user_id = 3)"
Run Code Online (Sandbox Code Playgroud)
这导致NoMethodError:
Review.where("reviewed_user_id = ?", self.reviewed_user_id).average(:stars).to_sql
#=> undefined method `to_sql' for 3:Fixnum
Run Code Online (Sandbox Code Playgroud)
这意味着to_sql调用AREL的结果而不是AREL对象 - 但为什么呢?
如何获取生成的SQL?
如何在Rails中找到最少的2个DateTime对象?
最近,Ruby社区发布了博客文章,推文以及关于使用更好的OO设计的好处的评论,特别是将业务逻辑与持久性逻辑分离.特别是对于较大的应用,我认为这是一个很好的建议.
我有兴趣找到一个完整的示例Rails应用程序,其中业务逻辑与ORM(ActiveRecord或其他)完全分离.具体来说,我很有兴趣看到如何处理数据库约束,业务规则验证,参数清理,服务类等.
有人知道像这样的开源应用吗?
在Rails控制台中,我正在创建一个记录,然后输入@ record.save,我得到了错误,但我无法弄清楚为什么?Rails C中有没有办法输出保存失败的原因?
谢谢