issue_id
ハンドリングをモデルレベルまで下げます。before_validation コールバックを使用して、issue_id
. これだけでは、save
呼び出しがトランザクションにラップされていても、競合状態を防ぐことはできません。@ PinnyM で提案されているよう[ :company_id, :issue_id ]
に、インデックス/一意の制約をテーブルに追加して、カップルの一意性をさらに確保する必要があります。issues
だから、このようなもの
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 の回答を参照してください。
お役に立てれば。