Ruby on rails 为循环中的Rails记录设置属性
我有一个型号Ruby on rails 为循环中的Rails记录设置属性,ruby-on-rails,ruby-on-rails-4,rails-activerecord,Ruby On Rails,Ruby On Rails 4,Rails Activerecord,我有一个型号用户。我想要一个函数,它为每个用户记录设置属性emotion等于happy class User < ActiveRecord::Base attr_accessor :emotion def self.add_a_happy_emotion users = User.all users.each do |user| user.emotion = "happy" end users end end class用户
用户
。我想要一个函数,它为每个用户记录设置属性emotion
等于happy
class User < ActiveRecord::Base
attr_accessor :emotion
def self.add_a_happy_emotion
users = User.all
users.each do |user|
user.emotion = "happy"
end
users
end
end
class用户
在我的控制台中调用
>User.add_a_happy_emotion
时,用户没有任何emotion
属性。它们将仅具有默认的模型属性。如果在do循环中调用属性,则不会设置该属性吗?或者这与attr_访问器有关?或者我错过了什么 可能是它正在返回缓存的副本。这个怎么样
def self.add_a_happy_emotion
users = User.all
users.each do |user|
user.emotion = "happy"
end
end
如果您使用的是Rails 4<代码>用户。所有将返回活动记录关系,而不是数组 因此,您必须修改代码以获得用户将更新的属性
def self.add_a_happy_emotion
users = User.all
result_users = users.map do |user|
user.emotion = "happy"
user
end
result_users
end
它有两个问题:
1-您的属性访问器正在覆盖Rails'。在Rails中确实不需要它。只需将模型的属性放入迁移中,就可以了
2-如果修改用户对象而不保存它们,更改将永远不会持久化。为此,您可以使用更新_属性
因此,你最终会得到如下结果:
class User < ActiveRecord::Base
#no more attr_accessor here
def self.add_a_happy_emotion
users = User.all
users.each do |user|
user.update_attribute(:emotion, "happy") #this persists the entities to the DB
end
end
end
class用户
User.all将返回一个关系,但当他使用每个关系进行迭代时,查询将命中数据库。所以他的是正常使用。另外,当您使用map时,您应该使用每个,所以您不需要返回用户。map()用于更改迭代结果的格式。