ActiveRecord:更新补丁中的外键

时间:2013-04-01 14:35:20

标签: ruby-on-rails activerecord

表:

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,因为它可能在所有DB中都不完全相同。我想关闭更新的状态名称。

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

试过这个,但它没有用     App.update_all(:status =&gt;'Tested',:status =&gt;'Beta')

1 个答案:

答案 0 :(得分: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])