相关疑难解决方法(0)

适用于4.0的Rails Observer替代品

随着Observers正式从Rails 4.0中删除,我很好奇其他开发人员在他们的位置使用了什么.(除了使用提取的宝石.)虽然Observers肯定被滥用并且有时很容易变得笨拙,但是在缓存清除之外有许多用例,它们是有益的.

例如,需要跟踪模型更改的应用程序.观察者可以轻松地观察模型A的变化,并在数据库中记录模型B的变化.如果你想观察几个模型的变化,那么一个观察者就可以处理它.

在Rails 4中,我很好奇其他开发人员使用什么策略代替Observers来重新创建该功能.

就个人而言,我倾向于某种"胖控制器"实现,在每个模型控制器的创建/更新/删除方法中跟踪这些更改.虽然它稍微膨胀了每个控制器的行为,但它确实有助于可读性和理解,因为所有代码都在一个地方.缺点是现在的代码非常相似,分散在几个控制器中.将该代码提取到帮助器方法是一种选择,但您仍然可以调用遍布各处的方法.不是世界末日,也不是"精瘦控制者"的精神.

ActiveRecord回调是另一种可能的选择,虽然我个人并不喜欢,因为在我看来它往往会将两个不同的模型紧密地结合在一起.

所以在Rails 4中,no-Observers世界,如果你必须在创建/更新/销毁另一条记录之后创建一条新记录,你会使用什么样的设计模式?胖控制器,ActiveRecord回调,还是完全不同的东西?

谢谢.

ruby-on-rails ruby-on-rails-4

149
推荐指数
6
解决办法
3万
查看次数

使用WITH子句查询Postgres"缺少FROM子句条目"错误

我试图在Postgres 9.1.3中使用此查询:

WITH stops AS (
    SELECT citation_id,
           rank() OVER (ORDER BY offense_timestamp,
                     defendant_dl,
                     offense_street_number,
                     offense_street_name) AS stop
    FROM   consistent.master
    WHERE  citing_jurisdiction=1
)

UPDATE consistent.master
SET arrest_id = stops.stop
WHERE citing_jurisdiction=1
  AND stops.citation_id = consistent.master.citation_id;
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

ERROR:  missing FROM-clause entry for table "stops"
LINE 12: SET arrest_id = stops.stop
                         ^

********** Error **********

ERROR: missing FROM-clause entry for table "stops"
SQL state: 42P01
Character: 280
Run Code Online (Sandbox Code Playgroud)

我真的很困惑.根据Postgres文档,WITH子句显示正确.如果我在WITH子句中单独运行查询,我会得到正确的结果.

sql postgresql with-clause

23
推荐指数
1
解决办法
4万
查看次数