尝试Ruby on Rails我正在摆弄一个小应用程序。到目前为止,我喜欢rails方式。我的模型管理有经理和组织。
我想确保 - 使用验证 - 分配给管理员的经理与管理员所属的组织相关联。
我有一个有效的验证,但我的直觉表明它在查询上很昂贵。
class Administration < ActiveRecord::Base
belongs_to :organisation
belongs_to :manager, :class_name => "User", :foreign_key => 'manager_id'
validates :code, numericality: true
validates :manager_id, :presence => true
validates :organisation_id, :presence => true
validates :code, uniqueness: { scope: :organisation_id, message: 'BB: Code already in use' }
validate :manager_belongs_to_organisation
def manager_belongs_to_organisation
errors.add(:base, 'BB: Manager does not exist') unless Organisation.find(self.organisation_id).users.include?(User.find(self.manager_id))
end
end
对此事有何想法?
答案 0 :(得分:0)
解决此问题的一种方法是仅将经理分配给Administration
。然后使用organization_id
回调自动插入before_save
:
class Administration
...
before_save :update_organization_id
...
def update_organization_id
self.organization_id = self.manager.organization_id
end
end
答案 1 :(得分:0)
您的数据模型似乎有更多问题。
请不要忘记single responsibility principle。在Administration
模型中,我的检查关系位于Manager
和Organization
之间。
总的来说这是个坏主意。
您的经理是否只有一个组织?如果是这样,更好的解决方案是仅存储Administration
的经理,并在需要时调用administration.manager.organization
。并为您的Manager
模型添加验证:
validates :organization, presence: true