Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 为循环中的Rails记录设置属性_Ruby On Rails_Ruby On Rails 4_Rails Activerecord - Fatal编程技术网

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()用于更改迭代结果的格式。