小编Ben*_*Cbr的帖子

Rails ActiveRecord - update_all:如何使用混合类型的参数一次更新多个字段

我有一个用例,我想使用ActiveRecord :: Relation update_all方法并指定几个要设置的字段.我使用update_all,因为可以更新很多条目,我不想加载它们并逐个更新它们.

其中一些需要直接的SQL SET语句,例如因为我根据另一列的值设置了一列.

是否有一个简单的语法与update_all使这个可读,沿着这个=>的行

MyModel.where(state: :foo).update_all([
  'timespent = timespent + 500',  # Can't be anything else than a SQL statement
  state: :bar,  # Regular Rails SQL interpolation
  updated_at: DateTime.current   
])
Run Code Online (Sandbox Code Playgroud)

需要注意的是上面的语法不工作,因为它会尝试寻找占位符和替换值,因此state: :barupdated_at: DateTime.current被忽略.

对此的部分解决方案是将所有内容转换为单个SQL语句字符串,如下所示,但我不太喜欢这个,因为我需要弄清楚SQL语句,并且在使用Rails进行编码时有点过于复杂;):

MyModel.where(state: :foo).update_all([
  "timespent = timespent + 500",  # Can't be anything else than a SQL statement
  "state = 'bar'",
  "updated_at = NOW()"   # Needed to translate from Rails to PGSQL
].join(', '))
Run Code Online (Sandbox Code Playgroud)

那个有优雅解决方案的人呢?

谢谢 !

ruby activerecord ruby-on-rails

8
推荐指数
1
解决办法
2450
查看次数

Canonical Celery 单文件 hello world

我似乎无法在网上的任何地方找到一个可以使用 Celery 和 Python 从头到尾运行的单个文件来演示它,所以我尝试制作一个。由于某种原因,这不起作用,我是芹菜的新手。在test_celery.py我添加了以下内容:

from celery import Celery
import time

app = Celery(
    'test_celery'
    ,broker= 'redis://localhost/0',
    backend='redis://localhost/1'
)

@app.task
def add(x, y):
    time.sleep(2)
    return x + y

if __name__ == '__main__':
    result = add.delay(4, 4)
    print( result.get() )
Run Code Online (Sandbox Code Playgroud)

然后我在本地主机上运行 redis 服务器并在控制台输入:

celery -A test_celery worker --loglevel=info
Run Code Online (Sandbox Code Playgroud)

所以,现在工作人员正在倾听,我试着运行python test_celery.py,认为我应该在控制台输出中看到我的精彩 8。在工作控制台的日志中,我看到[2015-01-02 16:53:08,807: INFO/MainProcess] Task test_celery.add[2c6b19c0-3a3f-45d2-8024-64e112fa3419] succeeded in 1.9970000002067536s: 8哪个符合预期,但对result.get主程序控制台的调用挂起。

我一定在这里遗漏了一些基本的东西,如果有人能帮忙那就太好了。

python redis celery python-3.x

5
推荐指数
1
解决办法
1411
查看次数

标签 统计

activerecord ×1

celery ×1

python ×1

python-3.x ×1

redis ×1

ruby ×1

ruby-on-rails ×1