2009-10-07 28 views
5

Tôi có hồ sơ Dự án hiện tại và tôi đang nhập tệp CSV để cập nhật các thuộc tính Dự án được liên kết. Tuy nhiên, thường CSV sẽ chứa các trường trống và tôi không muốn các thuộc tính exisiting hoàn toàn nếu trường CSV có liên quan trống.Cập nhật các thuộc tính trừ khi để trống?

Something như thế này:

project.update_attributes(:name => row.field('project_name') unless row.field('project_name').blank?,            
          :owner => row.field('project_owner') unless row.field('project_owner').blank?, 
          :due_date => row.field('project_due_date') unless row.field('project_due_date').blank?) 

Trả lời

23
project.update_attributes({:name => row.field('project_name'),                   
          :owner => row.field('project_owner'), 
          :due_date => row.field('project_due_date')}.reject{|k,v| v.blank?}) 
0
attrs = [:name,:owner,:due_date].inject({}) {|res,obj| res[obj] = row.field("project_#{obj}") unless row.field("project_#{obj}").blank? } 
project.update_attributes attrs 
+2

Không phải rất dễ dàng có thể đọc được; ( –

+0

Đồng ý, so với giải pháp đã chọn. – khelll

1

Đây là một câu hỏi cũ, nhưng đối với các hồ sơ, bạn cũng có thể thiết lập một thuộc tính để nil (như trái ngược với trống) để loại trừ nó từ danh sách cập nhật. Tôi sẽ không gọi ví dụ thực hành tốt nhất sau đây, nhưng tôi nghĩ nó có thể giúp làm rõ những gì đang diễn ra trong nền: update_attributes sẽ chỉ cố gắng cập nhật các thuộc tính được cung cấp trong băm, có giá trị không phải là nil.

params[:csv] = nil if params[:csv].blank? or (arbitrary other condition) 
# now update like normal 
if @project.update_attributes(project_params) 
    ... 
etc. 
1

Bạn có thể làm này từ bộ điều khiển nếu cần thiết:

def some_params 
    params.permit(:foo, :bar).reject { |_, v| v.blank? } 
end 

Trong trường hợp này các thuộc tính sẽ không được lưu nếu họ là trống

Các vấn đề liên quan