例如,请考虑以下代码(在模型中):
scope :popular, where("views >= 250 OR (views >= 10 AND avg_rating >= 4.75)")
def popular?
views >= 250 or views >= 10 && avg_rating >= 4.75
end
Run Code Online (Sandbox Code Playgroud)
第一个条件是SQL,第二个条件是ruby,但仍然存在明显的重复.干嘛有什么好方法吗?这种情况的最佳做法是什么?
最近我遇到了一些奇怪的行为,defined?用于检查super关键字是否可以在当前上下文中使用.通常它工作正常,但当我尝试将defined? super检查与一点点元编程相结合时,它给了我意想不到的结果.
然后展示更容易描述,所以这里有一个举例说明问题:
class A;
def self.def_f!;
singleton_class.send(:define_method, :f) { defined? super }
end
end
class AA < A; end
Run Code Online (Sandbox Code Playgroud)
(A和AA类都有.def_f!类方法)
A.def_f!
A.f # => nil
AA.f # => nil
Run Code Online (Sandbox Code Playgroud)
(A.f没有超级和AA.f派遣A.f,所以一切都好,到目前为止,但......)
AA.def_f! # define its own .f method in the AA class
AA.f # => "super"
A.f # => "super" # WHY???
Run Code Online (Sandbox Code Playgroud)
谁能解释我最后一行?A.f没有超级方法,为什么它返回"super"而不是nil?这是一个错误吗?
(我在1.9.2和1.9.3中尝试过 - 相同的结果) …
我正在用红宝石写一个简单的dsl.几周前,我偶然发现了一些博文,其中展示了如何转换代码:
some_method argument do |book|
book.some_method_on_book
book.some_other_method_on_book :with => argument
end
Run Code Online (Sandbox Code Playgroud)
更清洁的代码:
some_method argument do
some_method_on_book
some_other_method_on_book :with => argument
end
Run Code Online (Sandbox Code Playgroud)
我不记得如何做到这一点,我不确定缺点,但更清晰的语法是诱人的.有没有人对这种转变有所了解?
默认情况下,邀请邮件的主题是
mailer:
invitation_instructions:
subject: 'Invitation instructions'
Run Code Online (Sandbox Code Playgroud)
我想改成它
subject: '%{invited_by} has invited you!'
Run Code Online (Sandbox Code Playgroud)
但是这需要让i8n的translate方法可以访问invite_by变量.
如何在不更改默认行为的情况下访问/声明此变量?
ruby-on-rails actionmailer devise rails-i18n devise-invitable
ruby ×2
actionmailer ×1
activerecord ×1
block ×1
devise ×1
dry ×1
dsl ×1
rails-i18n ×1
scope ×1