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

时间:2016-01-30 00:52:06

标签: ruby-on-rails activerecord rails-activerecord params

每个订单我的数据库都有一个或多个订单明细。

假设以下代码:

# 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

2 个答案:

答案 0 :(得分:2)

假设订单详情与

类似
order_details.detail_name
order_details.detail_date
order_details.detail_price

和order_details_params就像

order_details_params[:detail_price] etc

返回order_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

答案 1 :(得分:0)

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

  1. model
  2. 无法访问参数
  3. 您正在使用where来推测记录(应为find_by
  4. 您认为您的数据完整性是错误的(不应该是这种情况)
  5.   

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

    换句话说.... 如何检查缺少的提交数据?

    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的正确方法。验证将同时在create&amp; update,确保输入到模型中的所有数据都会在存储之前验证

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

    -

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

    但是,在追求convention时,您希望使用上述验证模式进行重构。