将临时属性添加到模型

时间:2017-02-06 16:12:47

标签: ruby-on-rails ruby

我开始在rails上学习ruby,我想临时为模型添加一个属性,所以我在我的模型中添加了访问器:

attr_accessor :dettes

然后我使用方法each,这就是我所拥有的:

@depenses = Depense.where(user_id: @user.id)
@depenses.each do |d|
  d.dettes =  "value"
end
render json: @depenses

但是这没有用,我的新属性没有添加

我已经看到其他人对此有疑问,但我仍然无法解决这个问题,我错过了什么吗?

2 个答案:

答案 0 :(得分:0)

默认情况下,render :json仅添加永久属性。你也可以这样添加临时的:

render json: @depenses, methods: :dettes

答案 1 :(得分:0)

据我所知,您希望在请求中修改对象而不在数据库中对其进行变更,因此您需要添加attr_accessor。 然后你用了

@depenses = Depense.where(user_id: @user.id)

返回ActiveRecord :: Relation的实例(不是您可以修改的对象的显式实例)。因此,当您在此关系实例中进行迭代并将其更改为attr_accessor时,尚未将modyfied对象的实例分配给任何公共变量。基本上你需要将关系转换为数组,然后@depenses将成为Depense实例对象的数组,你可以修改它们并传递给渲染方法:

@depenses = Depense.where(user_id: @user.id).to_a

然后你需要告诉json你想使用自定义方法进行序列化,比如@eiko提到:

render json: @depenses, methods: :dettes

(但是如果你在Depense数据表中有一堆数据,那么这不是最好的主意,你会在where子句的偏移量中使用一些限制)

继续摇摆;)