使用变量更新Active Record的属性

时间:2016-02-18 18:10:46

标签: ruby-on-rails ruby activerecord

我有一个名为Station ActiveRecord 。我想更新一些属性不是直接更新,而是使用变量。 类似的东西:

station = Station.where(attr1: "..." , attr2: "...") station.update_attributes(attr1: "...", attr2: "...", ..)

但是当我初始化station变量时,我得到 ActiveRecord :: Relation ,它没有update_attributes帮助器。我如何使用变量更新Station的某些字段,但不能直接更新?

3 个答案:

答案 0 :(得分:2)

您应该使用ActiveRecord#find_by来实现此目标:

station = Station.find_by(attr1: "..." , attr2: "...") # Station first instance with specified attributes
station.update_attributes(attr1: "...", attr2: "...", ..)

此方法返回Station个实例(如果它与您的属性一起存在)或nil其他情况。

如果您想查找所有 Station个实例并更新每个,则应使用ActiveRecord#update_all方法:

stations = Station.where(attr1: "..." , attr2: "...") #ActiveRecord::Relation
stations.update_all(attr1: "new_attr1" , attr2: "new_attr_2")

答案 1 :(得分:1)

问题是station是一个群体,而不是一个群体。所以,称之为stations以避免混淆。

stations = Station.where(attr1: "..." , attr2: "...")
new_values = my_get_new_vals(stations)
stations.each_with_index do |station, idx|
  station.update_attributes(new_values[idx])
end

如果要将所有数据设置为相同,则可以说

Station.
  where(attr1: "..." , attr2: "...").
  update_all(
    :payment_total => 20,
    :due_amount => 10,
    :data => clonedata.to_json)

您需要考虑这些更新的数据来源,以及如何将它与您发现需要更新的内容中的每个对象相关联。

答案 2 :(得分:1)

此代码station = Station.where(attr1: "..." , attr2: "...")将返回结果数组

您不能将update_attributes用于数组

所以改变你的代码

station = Station.where(attr1: "..." , attr2: "...")

 station.update_attributes(attr1: "...", attr2: "...", ..)

station = Station.where(attr1: "..." , attr2: "...")

station.update_all(attr1: "...", attr2: "...", ..)