我有一个名为Station
的 ActiveRecord 。我想更新一些属性不是直接更新,而是使用变量。
类似的东西:
station = Station.where(attr1: "..." , attr2: "...")
station.update_attributes(attr1: "...", attr2: "...", ..)
但是当我初始化station
变量时,我得到 ActiveRecord :: Relation ,它没有update_attributes
帮助器。我如何使用变量更新Station
的某些字段,但不能直接更新?
答案 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: "...", ..)