0

表:

apps:
ID (PK)
name
status_id (FK to status table)

status:
ID(PK)
name


class App < ActiveRecord::Base
    belongs_to :status
end

class Status < ActiveRecord::Base
  has_many :apps
end

我有几个状态。

Name       PK
Unreviewed (1)
Reviewed   (2)
Beta       (3)

我想将状态为“Beta”的所有应用程序的状态更改为“未审核”状态。主键是存储在 Apps 表中的内容。但是,我不想只键入 PK,因为它在所有数据库中可能并不完全相同。我想关闭更新的状态名称。

我似乎无法弄清楚如何在 Apps 表上发布 update_all。

试过这个,但它不起作用 App.update_all(:status => 'Tested', :status => 'Beta')

4

1 回答 1

0

试试App.update_all("appstatus = 'Tested'", "appstatus = 'Beta'")。第一部分update_all是您要设置的内容,第二部分是条件。我不认为使用哈希火箭update_all来设置你拥有的值和条件。

根据更新的问题文本:

App.includes(:status).where("statuses.name = ?", 'Beta').update_all(["apps.status_id = ?", Status.find_by_name('Tested')])

你也可以做一些事情:

testing_status = Status.find_by_name('Testing')
App.update_all(['status_id = ?', testing_status.id], 'status_id = 3')

根据您要执行的操作,我真的建议将状态设置为 App 模型上的字符串。它会让你的生活更轻松。

class App < ActiveRecord::Base

  STATUSES = {:testing => 'Testing', :unreviewed => 'Unreviewed', :reviewed => 'Reviewed', :beta => 'Beta']

  # then you can create scopes to help you
  STATUSES.each do |status_type, status_value|
    scope status_type, lambda { where(:status => status_value) }
  end
end

然后,当您要进行批量更新时:

App.beta.update_all("status = ?", App::STATUSES[:testing])
于 2013-04-01T14:52:41.567 回答