从模型中获取所有值后,我想向ActiveRecord类添加另一个自定义属性(该属性不是db中的列),以便我可以在视图中使用它,但是rails会不允许我添加一个。我应该在模型类中添加什么?如何向ActiveRecord添加新属性
@test.all
@test.each do |elm|
elm[:newatt] = 'added string'
end
错误:
can't write unknown attribute `newatt'
从模型中获取所有值后,我想向ActiveRecord类添加另一个自定义属性(该属性不是db中的列),以便我可以在视图中使用它,但是rails会不允许我添加一个。我应该在模型类中添加什么?如何向ActiveRecord添加新属性
@test.all
@test.each do |elm|
elm[:newatt] = 'added string'
end
错误:
can't write unknown attribute `newatt'
试试这个
class Test < ActiveRecord::Base
attr_accessor :newattr
end
你可以像
访问@test = Test.new
@test.newattr = "value"
正如你可能会注意到这是一个属性,而不是散列。所以它使用.
语法。但是,如果你需要它表现得像一个哈希,你可以做到这一点没有定义一个新的属性
@test.all
@test.each do |elm|
new_elm = {}
new_elm[:newatt] = 'added string'
end
最后,我不完全知道你正在尝试做的。如果这对你没有意义,请重新修改你的问题,以便我们更好地理解问题。
我想你的意思是指定@test到ActiveRecord查询,是否正确?尝试:
@test = MyARClass.select("*, NULL as newatt")
@test.each {|t| t[:newatt] = some_value}
另一个相关的解决方案是让一个单独的类方法,但你不得不跳,虽然多个环,使其可写,我直观地感受到这样可能会带来更多的开销
@test = MyARClass.all
@test.each do t
def t.newatt
some_value
end
end
使用第二种方法,当然你可以通过@ test.first.newatt而不是@ test.first [:newatt]来访问它。你可以尝试重新定义t。[]和t。[] =,但是这开始变得非常混乱。
如果它真的只是暂时并不一定要在对象:
@test.all
@test_temp = []
@test.each do |elm|
@test_temp << {:elm => elm, :newatt => 'added string'}
end
否则,也good answers here的。
如果你想这只是你的意见,并没有任何其他目的,那么你不需要在这里你所添加的ActiveRecord的查询输出与值newattr属性添加attr_accessor
@test.all.select('tests.*, "added string" as newattr')
“添加字符串'
@test.all
@test.each do |elm|
write_attribute(:newatt, "added string")
end
我遇到了同样的问题。并成功绕过使用instance_eval
@test.all
@test.each do |elm|
elm.instance_eval { @newatt = 'added string' }
end
通常它不会遇到问题,当使用attr_accessor。当其他DSL重写“newattr =”时会出现这个问题。在我的情况下,它是钱轨“货币化:newatt”
显式使用write_attribute不起作用,因为它是在rails 4中引发异常的原因。x
你想用它做什么?只有一个范围,或者你想这样保存到数据库? – Mindbreaker
我不想将它保存到数据库。我正在做一些处理(请参阅更新的代码),并且我想为每个元素添加一些额外的信息。它只会在视图中使用。 – Ladiko
[将额外的运行时attribs添加到activerecord对象]可能的重复(http://stackoverflow.com/questions/7584592/adding-extra-run-time-attribs-to-an-activerecord-object) – mlt