2011-01-11 78 views
1

我使用ENVS列举如下:Rails ActiveRecord update_attributes!不工作

Mysql: 5.1.51-community MySQL Community Server 
Rails: 2.3.5 
Ruby: 1.8.7 

有一个记录,我得到的项目,然后我用下面的代码来更新属性,

item.update_attributes!(
    :a => a, 
    :b => b, 
    :c => c 
) 

所有这些更新属性只有字段的值发生了变化,其他属性值保持不变,但我不知道哪些属性发生了更改,所以我更新了所有属性。

在调试过程中,我发现该字段的值发生了变化,这与记录项的值不同,但更新没有任何效果。

有人可以帮我吗?谢谢。

补充:

刚才我跟踪到Rails代码,并且发现该问题与Rails代码此相关的:如果我改变了场分贝值清空

def update(attribute_names = @attributes.keys) 
     quoted_attributes = attributes_with_quotes(false, false, attribute_names) 
     return 0 if quoted_attributes.empty? 
     connection.update(
     "UPDATE #{self.class.quoted_table_name} " + 
     "SET #{quoted_comma_pair_list(connection, quoted_attributes)} " + 
     "WHERE #{connection.quote_column_name(self.class.primary_key)} =  #{quote_value(id)}", 
     "#{self.class.name} Update" 
    ) 
    end 

,然后attribute_names是包含字段a的数组,但db中的值不为空的字段,attribute_names是空数组,但@attributes始终是包含a,b和c的映射。看到rails代码后感到困惑。

+0

没有足够的信息给出 - 我们需要至少该模型能够正确回答这个问题。 – 2011-01-11 13:04:40

+0

我还应该提供哪些信息?谢谢你。 – ywenbo 2011-01-11 13:07:01

回答

0

我找到了原因,因为改变字段值的方法有错误,改变之后,它的原始值和新值都是一样的,所以AR没有做更新操作,因为没有任何字段被改变。

2

对不起有没有在这个问题去足够的信息,所以这只是猜测:

你使用attr_accessibleattr_protected这个模型中的任何机会呢?

使用attr_accessible它不包括b和c或attr_protected,它包括b和c将解释您所看到的行为。

如果是这种情况,你将不得不做出多个update_attribute!调用。