每个订单我的数据库都有一个或多个订单明细。
假设以下代码:
# 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
答案 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已接受答案:
model
where
来推测单记录(应为find_by
)如何检查
@order_details
上的哪些详细信息未作为参数发送
换句话说.... 如何检查缺少的提交数据?
#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时,您希望使用上述验证模式进行重构。