我有一个Rails 3项目.有了Rails 3,Arel就能够重用一个范围来构建另一个范围.我想知道在定义关系时是否有办法使用范围(例如"has_many").
我有记录,其中有权限列.我想构建一个default_scope,它将我的权限列考虑在内,以便过滤记录(甚至通过关系访问的记录).
目前,在Rails 3中,default_scope(包括我发现的补丁)没有提供传递proc的可行方法(我需要后期变量绑定).是否可以定义一个可以传递命名范围的has_many?
重用命名范围的想法如下:
Orders.scope :my_orders, lambda{where(:user_id => User.current_user.id)}
has_many :orders, :scope => Orders.my_orders
Run Code Online (Sandbox Code Playgroud)
或隐式编码关系中命名范围的内容如下所示:
has_many :orders, :scope => lambda{where(:user_id => User.current_user.id)}
Run Code Online (Sandbox Code Playgroud)
我只是尝试将default_scope应用于后期绑定.我更喜欢使用Arel方法(如果有的话),但会使用任何可行的选项.
由于我指的是当前用户,因此我不能依赖于最后一刻未评估的条件,例如:
has_many :orders, :conditions => ["user_id = ?", User.current_user.id]
Run Code Online (Sandbox Code Playgroud) 罗伯特马丁关于"建筑:失落的岁月"的谈话引起了我的兴趣.在其中,他讨论了MVC所基于的实体,边界,控制设计模式.我喜欢推迟建筑决策的想法.他描述了如何在他自己的wiki应用程序FitNesse中推迟实现数据库层的决定.我已经在我自己的编码中有机地推迟了这样的决定,尽管没有一个先入为主的模块化设计带来了这个.
我想从实际的角度更好地理解这个EBC架构(它似乎与DCI密切相关),以便我可以开始在一个小项目中使用.我想利用"推迟决定"以及交换UI等设计方面的能力.
例如,Rails使用了一种EBC(MVC)形式,但是它非常出色,以至于无法轻松替换备用UI,从而将Rails应用程序转换为控制台应用程序或桌面应用程序.关于设计的有趣之处在于,我可以通过交换一个东西并插入另一个来转换应用程序.也就是说,我想知道设计一个架构的想法,以便在某种程度上可以换掉UI或持久层.我觉得如果这个架构设计得很好,那么耦合会很低,而且这样的壮举将会被掌握.
我已经下令这本书由伊瓦尔·雅各布森说鲍勃在他的讲话中提到.我在网上搜索了不少,但我发现的所有例子都显示了简单的图表.我说代码.通过查看一些演示概念的简单类,并通过使用边界类展示如何将一个层(UI,DB)替换为其他实现,我将从中受益更多.
如果有人不能指出一个很好的资源说明这一点,那么难以鞭打吗?也许我们可以使用许多软件书中使用的备用示例:视频租赁商店(这些天几乎是遗物).请演示如何交换UI或DB层.令我困惑的一件事是观点.我无法从图中看出,如果视图本身就是边界类,或者它们只是与它们进行通信.此外,鲍勃提到EBC的初衷是我们有很多微视图而不是单一的宏视图(就像我们在典型的MVC中所做的那样); 我很好奇这可能是什么样子.(我更喜欢Ruby或JavaScript,但是,由于乞丐不能选择,任何一个例子都可以.)
谢谢.
Haskell讨论它的功能.尽管Clojure允许partial并使用宏作为执行相同操作的可比方法.
我以为我记得听到/读过希基的决定背后的原因.有人回忆起那个原因是什么,或者我在哪里可以找到它?
我希望从理论上学到一些东西.
为了使Web应用程序响应,您使用异步非阻塞请求.我可以设想两种方法来实现这一点.一种是使用延迟/承诺.另一个是网络工作者.对于Web工作者,我们最终会引入另一个进程,并且我们不得不来回传输数据.我正在寻找某种性能指标来帮助理解何时选择简单的非阻塞回调而不是Web worker.
是否有某种方法可以使用哪种方法而无需对这两种方法进行原型设计?我在网上看到很多关于网络工作者的教程,但我没有看到很多成功/失败的故事.我所知道的是我想要一个响应式应用程序.我正在考虑使用Web worker作为内存数据结构的接口,该数据结构可以是0.5-15MB(本质上是数据库),用户可以查询和更新.
据我了解javascript处理,可以执行单个长时间运行的任务并对其进行切片,以便定期进行控制,从而允许其他任务处理一段时间.这会是使用网络工作者的标志吗?
我知道ActiveRecord :: Dirty和相关的方法,但我没有看到我可以订阅属性更改事件的方法.就像是:
class Person < ActiveRecord::Base
def attribute_changed(attribute_name, old_value, new_value)
end
#or
attribute_changed do |attribute_name, old_value, new_value|
end
end
Run Code Online (Sandbox Code Playgroud)
是否有Rails标准或插件?我觉得它必定存在于某个地方,我只是想念它.
当您在类或其他模块中包含模块时,您可以调用它们
@mymod.included_modules
Run Code Online (Sandbox Code Playgroud)
获取包含的模块列表.
有没有相应的列出模块扩展的模块?
module Feature1
end
module Feature2
extend Feature1
end
Feature2.extended_modules #=> [Feature1]
Run Code Online (Sandbox Code Playgroud) 虽然Racket允许一个人创建GUI应用程序(甚至是游戏),但我想知道它是否适合在视觉上发布与Things或OmniOutliner相同的商业应用程序.这样的应用程序是原生的还是看起来像一个不属于平台的尴尬的继子?例如,Ubuntu上的Gnome应用程序无缝融入平台,即使有些是用Ruby或Python编写的.
Racket可以将其关闭,如果是这样,有人能指出我的例子吗?我正在尝试确定Racket的创建方式 - 从视觉角度来看 - 商业品质的应用程序.如果没有这个,就不能轻易用它来制作销售应用程序,这似乎会减少后端语言和学术用途.
在完美的应用程序中,每个业务规则只存在一次.
我在一家商店工作,尽可能在数据库中执行业务规则.在许多情况下,为了获得更好的用户体验,我们在客户端执行相同的验证.不是很干.作为SPOT纯粹主义者,我讨厌这个.
另一方面,一些商店创建了愚蠢的数据库(Rails社区倾向于这个方向)并将业务逻辑降级到一个单独的层.但即使采用这种方法,一些验证逻辑最终会重复客户端.
为了使问题进一步复杂化,我理解为什么数据库应该被视为堡垒,因此我同意在数据库中强制执行/重复验证.
考虑到相互矛盾的问题,尝试在一个地方强制执行验证并不容易 - 保持DRY,保持数据库成为堡垒,并提供良好的用户体验.我有一些克服这个问题的想法,但我想有更好的.
我们能否以干燥的方式平衡这些相互冲突的问题?
通常在控制台内,我会查询一个对象
pp obj.methods.sort #or...
pp (obj.methods - Object.methods).sort
Run Code Online (Sandbox Code Playgroud)
在Ruby中,开发人员为方法提供别名是很常见的.我想知道是否有一种识别别名的反射方式,以便我可以显示别名方法,如...
array.aliased_methods #=> {:collect => :map, ...}
Run Code Online (Sandbox Code Playgroud)
这有助于能够准确识别对象可以做多少事情.
我知道这个网站:
http://wiki.ecmascript.org/doku.php
但是,我还没有找到提供JavaScript语言建议更改的地方.这样做甚至对整个社区开放吗?最后,提到的网站是否提供了全面的提案列表.我会做一点研究.我不想提出已经提出过类似提案的建议.
ruby ×3
activerecord ×2
javascript ×2
alias ×1
architecture ×1
arel ×1
asynchronous ×1
attributes ×1
clojure ×1
currying ×1
dry ×1
events ×1
haskell ×1
named-scope ×1
promise ×1
racket ×1
web-worker ×1