2013-08-25 67 views
6

从模型中获取所有值后,我想向ActiveRecord类添加另一个自定义属性(该属性不是db中的列),以便我可以在视图中使用它,但是rails会不允许我添加一个。我应该在模型类中添加什么?如何向ActiveRecord添加新属性

@test.all 

@test.each do |elm| 
    elm[:newatt] = 'added string' 
end 

错误:

can't write unknown attribute `newatt' 
+0

你想用它做什么?只有一个范围,或者你想这样保存到数据库? – Mindbreaker

+0

我不想将它保存到数据库。我正在做一些处理(请参阅更新的代码),并且我想为每个元素添加一些额外的信息。它只会在视图中使用。 – Ladiko

+0

[将额外的运行时attribs添加到activerecord对象]可能的重复(http://stackoverflow.com/questions/7584592/adding-extra-run-time-attribs-to-an-activerecord-object) – mlt

回答

4

定义虚拟属性为实例变量:

attr_accessor :newattr 
+0

没有工作,请参阅更新的代码。 – Ladiko

+2

'elm.newatt ='added string'' –

+0

请按照Jesse在他的评论中指出的那样做 – boulder

8

试试这个

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 

最后,我不完全知道你正在尝试做的。如果这对你没有意义,请重新修改你的问题,以便我们更好地理解问题。

2

我想你的意思是指定@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。[] =,但是这开始变得非常混乱。

2

如果它真的只是暂时并不一定要在对象:

@test.all 
@test_temp = [] 

@test.each do |elm| 
    @test_temp << {:elm => elm, :newatt => 'added string'} 
end 

否则,也good answers here的。

3

如果你想这只是你的意见,并没有任何其他目的,那么你不需要在这里你所添加的ActiveRecord的查询输出与值newattr属性添加attr_accessor

@test.all.select('tests.*, "added string" as newattr') 

“添加字符串'

1
@test.all 

@test.each do |elm| 
    write_attribute(:newatt, "added string") 
end 
0

我遇到了同样的问题。并成功绕过使用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