【问题标题】:Rails 4 custom validation with many-to-many relationship具有多对多关系的 Rails 4 自定义验证
【发布时间】:2014-05-27 18:22:57
【问题描述】:

我有一个带有模型的应用程序,其中处方通过关系表与药物相关联。 我使用一种表格创建一个具有 5 个关系的处方,其中包含有关医学 ID、数量、每日等信息。但是,医学表有更多信息,这就是我在验证时想要使用的信息。

例如 - 我想检查表 medicines 中的字段 dose 是否类似于 `'%pills'。如果是这样,我想做一些计算来检查用户在填写表格时输入的金额是否在范围内(假设 30-40 仅适用于这种特定药物)

我的关系模型:

class Relation < ActiveRecord::Base
    belongs_to :prescription
  belongs_to :medicine

  validates :amount, numericality: {only_integer: true, :greater_than_or_equal_to => 1 }
  validates :daily, numericality: {only_integer: true, :greater_than_or_equal_to => 1 }
  validates :period_in_days, numericality: {only_integer: true, :greater_than_or_equal_to => 1 }

  validate :amount_limit, :if => :pills_form?

  private

    def amount_limit

    end

    def pills_form

    end
end

我在验证关系时如何获取药物表中的这些信息?或者还有其他更合适的方法吗?

【问题讨论】:

  • 您应该可以通过调用medicine.dose获得这些信息
  • @BroiSatse 我对它的运行效果印象深刻,你当然是对的。现在是摆脱rails在我的错误消息之前放置的错误前缀的情况。例如errors.add(:amount, "An amount of medicine cannot exceed 90 days of treatment.") 并且因为我验证处方而不是关系最终错误看起来像Relations amount An amount of medicine cannot exceed 90 days of planned treatment.。它发生在嵌套形式的任何字段中,即关系。知道该怎么做吗?

标签: ruby validation ruby-on-rails-4 many-to-many


【解决方案1】:

感谢@BroiSatse

class Relation < ActiveRecord::Base
  belongs_to :prescription
  belongs_to :medicine

  validates :amount, numericality: {only_integer: true, :greater_than_or_equal_to => 1 }
  validates :daily, numericality: {only_integer: true, :greater_than_or_equal_to => 1 }

  validate :amount_limit, :if => :pills_form?

  private

    def amount_limit
      max_amount = self.daily * 90
      in_box_amount = medicine.cardinality.scan(/\d+/).first
      sum = self.amount * in_box_amount.to_i
      if sum > max_amount
        errors.add(:amount, "An amount of medicine cannot exceed 90 days of treatment.")
      end
    end

    def pills_form?
      pill_form_array = ['plaster' , 'globul', 'czop', 'guma', 'tablet', 'pastyl', 'kaps', 'lamel']
      pill_form_array.any? { |item| medicine.form =~ /#{item}/ }
    end
end

【讨论】:

    猜你喜欢
    • 2016-10-09
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    • 2014-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多