我想借此issue_id
處理到模型級別。您可以使用before_validation回調來設置issue_id
。即使save
調用被封裝在一個事務中,也不會阻止競爭條件。正如@PinnyM所建議的那樣,您必須通過向您的issues
表中添加索引/唯一約束來進一步確保夫婦[ :company_id, :issue_id ]
的唯一性。因此,像這樣
class Issue < ActiveRecord::Base
attr_accessible :company_id, :issue_id
belongs_to :company
before_validation :set_issue_id
private
def set_issue_id
self.issue_id = self.company.issues.size + 1
end
end
class Company < ActiveRecord::Base
has_many :issues
end
和遷移內:
add_index :issues, [:issue_id, :company_id], :unique => true
而且像你說的,你可以抓住正確的問題控制器:
@issue = Issue.where(company_id: current_user.company.id, issue_id: params[:id])
注意,這不提供一種方法來從約束違規異常中恢復,以防實際發生。有關如何處理此問題的建議,請參閱@PinnyM回答。
希望這會有所幫助。
所以你想'問題'有一個由'id'和'company_id'組成的複合主鍵? – PinnyM 2013-02-18 16:59:27
不確定什麼是最好的方式來得到這個工作是(雖然我可以一起黑客攻擊) - 即當一個請求進入/問題/ 5701,@issue = Issue.where(company_id:current_user.company.id,issue_id: PARAMS [:ID])。我更關心的是,這是否是將這種事情存儲在數據庫中的最佳方式(以及前面提到的db查找以獲得該公司的下一個可用issue_id感覺很糟糕)。 – Tom 2013-02-18 17:08:51