我开始在rails上学习ruby,我想临时为模型添加一个属性,所以我在我的模型中添加了访问器:
attr_accessor :dettes
然后我使用方法each
,这就是我所拥有的:
@depenses = Depense.where(user_id: @user.id)
@depenses.each do |d|
d.dettes = "value"
end
render json: @depenses
但是这没有用,我的新属性没有添加
我已经看到其他人对此有疑问,但我仍然无法解决这个问题,我错过了什么吗?
答案 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子句的偏移量中使用一些限制)
继续摇摆;)