表:
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')
答案 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])