检查变量数据是否存在于参数中 - Rails 4

Check if variable data exists into params - Rails 4

我的数据库中有每个订单的一个或多个订单详细信息。

假设如下代码:

# order_detail.rb

def self.by_order_id(order_id)
    where("order_id = ?", order_id)
end

def self.process_order_details(order, order_details_params)
    @order_details = OrderDetail.by_order_id(order.id)

    # answer here...
end

如何检查 @order_details 的哪些详细信息未作为参数发送到 order_details_params

假设订单详情类似于

order_details.detail_name
order_details.detail_date
order_details.detail_price

和order_details_params就像

order_details_params[:detail_price] etc

到returnorder_details_params

中缺少属性
@order_details.attributes.map {|k,v| k}.each do |detail_attrib|
  [DO SOMETHING] if order_details_params[detail_attrib.to_sym].blank?
end

例如。这将输出一个缺少属性的数组

missing = Array.new
@order_details.attributes.map {|k,v| k}.each do |detail_attrib|
  missing.push detail_attrib if order_details_params[detail_attrib.to_sym].blank?
end

--

Rich Peck 编辑

您可以将最后一个循环重构为:

@order_details.attributes.each do |detail_attrib, v|
  missing.push detail_attrib if order_details_params[detail_attrib.to_sym].blank?
end

有几个anti-patterns接受了答案:

  1. 无法在 model
  2. 中访问参数
  3. 您正在使用 where 来拉取一条 单条 记录(应该是 find_by
  4. 您假设您的数据完整性是错误的(事实并非如此)

How can I check which details on @order_details were not sent as param

换句话说.... 我如何检查丢失的提交数据?

Validations:

#app/models/order_detail.rb
class OrderDetail < ActiveRecord::Base
   belongs_to :order
   validates  :name, :date, :price, presence: true
   scope      :by_order_id, ->(id) { find_by order_id: id } #-> OrderDetail.by_order_id(2)
end

这是处理 OrderDetail 模型的 data integrity 的正确方法。验证将在 createupdate 上触发,确保输入到模型中的任何数据都将在 存储之前得到验证:

@order_detail = OrderDetail.new order_detail_params
@order_detail.save #-> false, will return errors

--

当然,接受的答案以编程方式工作。

但是,在追求 convention 的过程中,您需要使用上述验证模式进行重构。