2015-11-11 26 views
1

我有这样的代码在Rails中4如何知道:轨道4,如果更新已执行

mmkBase = Mmk::Base.find_or_initialize_by(id: id) 
mmkBase.update(name: name, city: city, country: country, address: address, region_ids: regionIds, latitude: latitude, 
         longitude: longitude) 

的代码工作不错,但现在我需要收集一些统计数据,比如:

  • 基数。
  • 新基地的数量。
  • 加载(更新)基数。

基数不是问题。新基地的数量,我想我可以检查find_or_initialize返回的对象mmkBase是否具有比ID更多的属性,例如名称。 但是,我不知道如何检查更新操作是否运行。

有什么办法可以知道吗?有没有更好的方法来实现这一目标?也许,我应该使用更传统的方式来做到这一点,首先选择?

+3

回应“我不知道如何检查更新操作是否运行” - [更新](http://apidock.com/rails/ActiveRecord/Persistence/update)方法返回“false”如果验证失败并且对象未保存。 – p4sh4

回答

2

你想一个已经存在的记录和新创建的记录来区分。在仅由find_or_initialize_by初始化的新记录中,new_record?返回true。因此,例如,你可以写:

mmkBase = Mmk::Base.find_or_initialize_by(id: id) 
new_base = mmkBase.new_record? 
if mmkBase.update(name: name, city: city, country: country, address: address, region_ids: regionIds, latitude: latitude, 
        longitude: longitude) 
    # update was successful 
    if new_base 
    new_bases += 1 
    else 
    updated_bases += 1 
    end 
else 
    # error handling 
end 

注意,它可能不使用find_or_initialize_by与记录的ID是个好主意。见Rich Peck's answer

+0

任何类似的方法来区分何时更新方法正在进行插入或更新? – Rober

+0

@Rober:不,'update'只设置属性并保存模型:http://apidock.com/rails/ActiveRecord/Persistence/update您必须先获取此信息。也许有一种更加优雅的方式来做你想做的事情,但是你必须提供更多的信息来回答这个问题(你想让你的应用程序中的全局更新的数字或方法中的全局更新的数字,代码位于循环?在控制器?),也许在另一个问题? –

-3

您可能可以检查对象上的updated_at时间戳,以查看它是否最近已更新,但Rails 4更新方法不会告诉您对象是否已更新。

http://apidock.com/rails/ActiveRecord/Base/update/class

+2

这是错误的。你正在链接到一个古老的文档。由于Rails 3,'update'方法位于'ActiveRecord :: Persistence'模块中,并且如果验证失败且对象未保存,它将返回false:http://apidock.com/rails/ActiveRecord/Persistence/update – p4sh4

3

不过,我不知道我怎么能检查是否执行更新操作

您可以简单地使用...

if mmkbase.update mkbase_params 
... 
else 
... 

这将调用update方法,根据其是否成功确定响应(true = success; false = validation failure


的新基地

如前所述号,new_record?方法是什么您这里需要...

if mmkbase.new_record? #-> mmkbase hasn't been saved to db yet 

我应该这样做:

mmkBase.find_or_create_by(mmkbase_params) do |base| 
    #do something if new base 
end 

private 

def mmkbase_params 
    params.require(:mmkbase).permit(:name, :city, :country, :address, :region_ids, :latitude, :longitude) 
end 

如果您有其主键(find_or_initialize_by id:)拉这种类型的数据,你就麻烦了...... 你怎么知道主键是否会保持不变?

当然,情况并非总是如此。更改user的详细信息将要求您引用用户id - 但是数据是严格的。 IE注册一个用户(用nameemail),而你现在正在寻找用户(它不能被动态创建)。

我不知道你的模式;这可以这样创造任何东西应该由它的核心数据(namecity等)被引用...

mmkbase.find_by(name: ....) 

在关系数据库中,你需要处理的数据,而不是主键。在其他类型的数据库中,您可以处理索引,但使用这种类型的设置,使用纯数据更好。

+0

你说得对,'find_or_initialize_by(id:id)'没有意义。 –