use*_*964 13 ruby-on-rails ruby-on-rails-3
鉴于以下课程:
class Candidate
has_many :applications
has_many :companies, :through => :job_offers
end
class JobOffer
belongs_to :company
end
class Application
belongs_to :candidate
belongs_to :job_offer
end
Run Code Online (Sandbox Code Playgroud)
如何在Rails上验证之前的语句(在图像中)?
在更新时,在Application上添加以下验证将不起作用:
def validate_uniqueness_of_candidate_within_company
errors.add(:job_offer_id, "...") if candidate.companies.include?(company)
end
Run Code Online (Sandbox Code Playgroud)
当尝试将应用程序更改为同一公司候选人的其他JobOffer时,会导致该公司退回.
我也试过在应用程序上做这样的事情:
validates_uniqueness_of :user_id, :scope => {:job_offer => :company_id}
Run Code Online (Sandbox Code Playgroud)
但它也没有用.任何想法解决这个问题,而不必使用10行蹩脚的代码?
mik*_*ked 14
可能有许多可接受的方法可以解决您的问题,但我认为最重要的是您试图在没有(直接)具有所有属性(均为company
AND user
)的表上强制执行唯一性约束.我会去规范化company
信息到应用程序表(user_id
,job_offer_id
,company_id
),并始终将其设置为一个before_save
回调匹配job_offer
的company
.然后你应该能够使用范围唯一性验证:
class JobApplication < ActiveRecord::Base
belongs_to :user
belongs_to :job_offer
belongs_to :hiring_company, :class_name=>"Company", :foreign_key=>"company_id"
before_save :set_hiring_company
def set_hiring_company
self.hiring_company = job_offer.hiring_company
end
validates_uniqueness_of :user_id, :scope => :company_id
end
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
14874 次 |
最近记录: |