我有一个数据库表与另一个应用程序共享。它有很多列,我永远不会在我的应用程序中使用。是否可以在ActiveRecord模型中指定要被忽略的列?是否可以指定不应在ActiveRecord中加载的列?
通常情况下,这并不是什么大事,但在这种情况下,我得到了一张有两个斑点的表格,我永远不需要用另一个具有37列(我需要其中一列)的表格加入。
我想我可以在我的发现和关联中总是使用:select属性,但我只想配置一次。
我有一个数据库表与另一个应用程序共享。它有很多列,我永远不会在我的应用程序中使用。是否可以在ActiveRecord模型中指定要被忽略的列?是否可以指定不应在ActiveRecord中加载的列?
通常情况下,这并不是什么大事,但在这种情况下,我得到了一张有两个斑点的表格,我永远不需要用另一个具有37列(我需要其中一列)的表格加入。
我想我可以在我的发现和关联中总是使用:select属性,但我只想配置一次。
您可以在数据库中使用视图,而不是直接查看源表。这样做的好处是,如果添加另一个BLOB列,则不必更改代码,因为它不在视图中(除非更改视图),因此不会被拾取。
我想你应该能够为您指定模型default_scope
,传递:select
,指定你感兴趣的列。
class MyModel < ActiveRecord::Base
default_scope :select => 'column1, column2, column3'
end
是的,并指定哪些列不应加载,这应该工作(未经测试,'):'default_scope:select => column_names - ['column_to_exclude'])。join(',')' – molf 2010-01-11 17:36:38
你可以用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">]
默认范围是朝正确方向迈出的一步,但当模型是include的一部分时,它不会执行任何操作。我想我只需要指定每个关联的选择。 – Anna 2010-01-11 20:01:11
我正在使用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