2013-05-01 52 views
3

我有一個標準模型,有幾個字段保存到一個數據庫,我需要1個字段,不必保存。模型模型部分的虛擬領域,但不是在數據庫中

我試過attr_accessor但沒有覆蓋它。使用Attr_accessor我可以設置和獲取字段,但它不是模型的一部分。如果我將模型添加到數組中,然後看看虛擬域中的內容不是它的一部分。我還嘗試將字段:headerfield添加到attr_accessible,但這並沒有改變任何內容。

如何獲取屬於模型但未保存到數據庫的字段?

模型

class Mapping < ActiveRecord::Base 
    attr_accessible :internalfield, :sourcefield 
    attr_accessor :headerfield 
end 

控制檯輸出:

1.9.3-p194 :001 > m = Mapping.new 
=> #<Mapping id: nil, internalfield: nil, sourcefield: nil, created_at: nil, updated_at: nil, data_set_id: nil> 
1.9.3-p194 :002 > m.headerfield = "asef" 
=> "asef" 
1.9.3-p194 :003 > m 
=> #<Mapping id: nil, internalfield: nil, sourcefield: nil, created_at: nil, updated_at: nil, data_set_id: nil> 
+0

它實際上_is_模型的一部分,只有你不會看到

您可以通過以下使它對JSON它以您嘗試的方式使用控制檯輸出。你需要在哪裏使用這個虛擬屬性? – PinnyM 2013-05-01 21:16:48

+0

我需要它在一個純粹的JavaScript客戶端,沒有鐵路的意見。將對象呈現給JSON也不會給我這個屬性。 – Rudi 2013-05-02 07:10:40

回答

2

由於ActiveRecord :: Base爲標準序列化方法(包括to_sas_json)提供了自定義實現,所以除非以某種方式進行干預,否則將永遠不會看到沒有備份數據庫列的模型屬性。

render json: my_object, methods: [:virtual_attr1, :virtual_attr2] 

或者你也可以直接使用的as_json串行:

my_object.as_json(methods: [:virtual_attr1, :virtual_attr2]) 
0

您在控制檯中看到的回報是什麼都沒有,但to_s的價值。對於這種情況,代碼應該比自然語言更好,走在下面的代碼來看看,如果你瞭解

class A 
end 
=> nil 
A.new 
=> #<A:0xb73d1528> 
A.new.to_s 
=> "#<A:0xb73d1528>" 

class A 
    def to_s 
    "foobar" 
    end 
end 
=> nil 
A.new 
=> ble 
A.new.to_s 
=> "ble" 

你可以看到這個輸出,因爲ActiveRecord::Base定義的方法to_s考慮到只有屬性,這些屬性在數據庫中定義,而不是attr_accessor方法,可能使用attributes調用。

+0

我明白這個例子,儘管我很想知道「foobar」何去何從,哪裏出現了「ble」。但是,爲什麼to_s處理寫入數據庫的屬性,而不是使用attr_accessor創建的屬性? – Rudi 2013-05-02 07:13:12

+0

@Rudi編輯我的答案來掩蓋你的疑問 – fotanus 2013-05-02 11:47:29