2010-01-11 22 views
1

我有一個數據庫表與另一個應用程序共享。它有很多列,我永遠不會在我的應用程序中使用。是否可以在ActiveRecord模型中指定要被忽略的列?是否可以指定不應在ActiveRecord中加載的列?

通常情況下,這並不是什麼大事,但在這種情況下,我得到了一張有兩個斑點的表格,我永遠不需要用另一個具有37列(我需要其中一列)的表格加入。

我想我可以在我的發現和關聯中總是使用:select屬性,但我只想配置一次。

+0

默認範圍是朝正確方向邁出的一步,但當模型是include的一部分時,它不會執行任何操作。我想我只需要指定每個關聯的選擇。 – Anna 2010-01-11 20:01:11

+0

我正在使用oracle_enhanced適配器。我剛剛發現它有「ignore_table_columns」。 http://blog.rayapps.com/2008/06/28/activerecord-oracle-enhanced-adapter-version-111-released/ – Anna 2010-01-12 18:24:39

回答

0

您可以在數據庫中使用視圖,而不是直接查看源表。這樣做的好處是,如果添加另一個BLOB列,則不必更改代碼,因爲它不在視圖中(除非更改視圖),因此不會被拾取。

3

我想你應該能夠爲您指定模型default_scope,傳遞:select,指定你感興趣的列。

class MyModel < ActiveRecord::Base 
    default_scope :select => 'column1, column2, column3' 
end 
+0

是的,並指定哪些列不應加載,這應該工作(未經測試,'):'default_scope:select => column_names - ['column_to_exclude'])。join(',')' – molf 2010-01-11 17:36:38

1

你可以用named_scope一起破解這個

named_scope :without, lambda {|arg| {:select =>Post.column_names.reject {|c| [arg].flatten.include? c.to_sym}.join(",")} } 

>> Post.column_names 
=> ["id", "title", "body", "test1", "test2", "created_at", "updated_at"] 
>> Post.without(:test1) 
    Post Load (0.4ms) SELECT id,title,body,test2,created_at,updated_at FROM "posts" 
=> [#<Post id: 1, title: "test post", body: "something something", test2: "test2 thing", created_at: "2010-01-11 17:11:41", updated_at: "2010-01-11 17:11:41">] 
>> Post.without([:test1,:body]) 
    Post Load (0.3ms) SELECT id,title,test2,created_at,updated_at FROM "posts" 
=> [#<Post id: 1, title: "test post", test2: "test2 thing", created_at: "2010-01-11 17:11:41", updated_at: "2010-01-11 17:11:41">] 
相關問題