检查变量数据是否存在于参数中 - 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接受了答案:
- 无法在
model
中访问参数
- 您正在使用
where
来拉取一条 单条 记录(应该是 find_by
)
- 您假设您的数据完整性是错误的(事实并非如此)
How can I check which details on @order_details
were not sent as param
换句话说.... 我如何检查丢失的提交数据?
#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
和 update
上触发,确保输入到模型中的任何数据都将在 在 存储之前得到验证:
@order_detail = OrderDetail.new order_detail_params
@order_detail.save #-> false, will return errors
--
当然,接受的答案将以编程方式工作。
但是,在追求 convention 的过程中,您需要使用上述验证模式进行重构。
我的数据库中有每个订单的一个或多个订单详细信息。
假设如下代码:
# 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接受了答案:
- 无法在
model
中访问参数
- 您正在使用
where
来拉取一条 单条 记录(应该是find_by
) - 您假设您的数据完整性是错误的(事实并非如此)
How can I check which details on
@order_details
were not sent as param
换句话说.... 我如何检查丢失的提交数据?
#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
和 update
上触发,确保输入到模型中的任何数据都将在 在 存储之前得到验证:
@order_detail = OrderDetail.new order_detail_params
@order_detail.save #-> false, will return errors
--
当然,接受的答案将以编程方式工作。
但是,在追求 convention 的过程中,您需要使用上述验证模式进行重构。