0

I'm using Rails-3 with psql

My problem is little bit funny. I don't know why its not working.

When I'm using this code everything is working perfectly

if @sd.supplier_document_users.first.status.eql?("Waiting")
   @sd.supplier_document_send_to_fi_user_lists.destroy_all
   @sd.supplier_document_users.first.destroy
   @fi_destroy_status = true
end

Here @sd.supplier_document_users return [] after this

When I add this if condition (if !@sd.supplier_document_users.blank?) like this

if !@sd.supplier_document_users.blank?              
    if @sd.supplier_document_users.first.status.eql?("Waiting")
       @sd.supplier_document_send_to_fi_user_lists.destroy_all
       @sd.supplier_document_users.first.destroy
       @fi_destroy_status = true
    end
end

Here @sd.supplier_document_users return value which I destroy above ( @sd.supplier_document_users.first.destroy)

I don't know what ghost come in my code.

4

2 回答 2

1

这是因为结果@sd.supplier_document_users可能会被 Rails 缓存。

在您的第二个示例@sd.supplier_document_users.blank?中,将所有用户加载到数组中并缓存结果。如果您@sd.supplier_document_users稍后再次调用,它仍然是同一个数组。如果要确保重新加载数组,请调用:@sd.supplier_document_users(true)

它适用于您的第一个示例,因为您不会加载所有用户。只是第一个(在数据库级别,而不是在数组级别)。

于 2013-11-06T12:05:09.880 回答
1

可以说它更清楚吗?:

if @sd.supplier_document_users.any?              
    if @sd.supplier_document_users.first.status.eql?("Waiting")
       @sd.supplier_document_send_to_fi_user_lists.destroy_all
       @sd.supplier_document_users.first.destroy
       @fi_destroy_status = true
    end
end

或者你可以这样写:

if @sd.supplier_document_users.any? && @sd.supplier_document_users.first.status.eql?("Waiting")
   @sd.supplier_document_send_to_fi_user_lists.destroy_all
   @sd.supplier_document_users.first.destroy
   @fi_destroy_status = true
end

无论如何它是如何不工作的?内部 if 中的代码是否没有被执行,或者您是否期望 if 有某种返回值?

于 2013-11-06T11:50:44.973 回答