限制自定义Rails4模型验证中的查询

时间:2015-09-26 08:46:50

标签: ruby-on-rails validation

尝试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

对此事有何想法?

2 个答案:

答案 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模型中,我的检查关系位于ManagerOrganization之间。 总的来说这是个坏主意。

您的经理是否只有一个组织?如果是这样,更好的解决方案是仅存储Administration的经理,并在需要时调用administration.manager.organization。并为您的Manager模型添加验证:

validates :organization, presence: true