停止Activerecord加载Blob列

10 activerecord blob lazy-loading

除非明确要求,否则如何告诉Activerecord不加载blob列?我的旧数据库中有一些非常大的blob必须被排除在"普通"对象之外.

小智 12

我刚刚使用导轨3遇到了这个问题.

幸运的是,解决起来并不困难.我设置了一个default_scope从结果中删除了我不想要的特定列.例如,在模型中我有一个xml文本字段可能很长,在大多数视图中都没有使用.

default_scope select((column_names - ['data']).map { |column_name| "`#{table_name}`.`#{column_name}`"})
Run Code Online (Sandbox Code Playgroud)

您将从解决方案中看到我必须将列映射到完全限定版本,因此我可以继续使用模型通过关系而不会在属性中出现歧义.之后,你确实希望让这个领域在另一个领域加入.select(:data)以包含它.


Mik*_*ffe 4

我相信您可以要求 AR 在您的调用中加载特定列来查找:

MyModel.find(id, :select => 'every, attribute, except, the, blobs')
Run Code Online (Sandbox Code Playgroud)

但是,当您添加列时,这需要更新,因此它并不理想。我认为没有任何方法可以专门排除 Rails 中的一列(也没有在单个 SQL 选择中)。

我想你可以这样写:

MyModel.find(id, :select => (MyModel.column_names - ['column_to_exclude']).join(', '))
Run Code Online (Sandbox Code Playgroud)

不过,在你相信我的话之前先测试一下这些。:)