我正在使用活动记录来获取我的故事,然后生成CSV,这是在rails cast中完成的标准方式.但我有很多行,需要几分钟.我想如果我能让posgresql做csv渲染,那么我可以节省一些时间.
这是我现在所拥有的:
query = "COPY stories TO STDOUT WITH CSV HEADER;"
results = ActiveRecord::Base.connection.execute(query);
Run Code Online (Sandbox Code Playgroud)
但是此查询的结果为空:
=> #<PG::Result:0x00000006ea0488 @connection=#<PG::Connection:0x00000006c62fb8 @socket_io=nil, @notice_receiver=nil, @notice_processor=nil>>
2.0.0-p247 :053 > result.count
=> 0
Run Code Online (Sandbox Code Playgroud)
更好的了解方式:
2.0.0-p247 :059 > result.to_json
=> "[]"
Run Code Online (Sandbox Code Playgroud)
我怀疑我的控制器看起来像这样:
format.csv { send_data raw_results }
Run Code Online (Sandbox Code Playgroud)
这适用于普通查询,我只是无法弄清楚将CSV结果返回到rails的SQL语法.
UPDATE
CSV输出从120000毫秒下降到290毫秒
我的模特:
def self.to_csv(story_ids)
csv = []
conn = ActiveRecord::Base.connection.raw_connection
conn.copy_data("COPY (SELECT * FROM stories WHERE stories.id IN (#{story_ids.join(',')})) TO STDOUT WITH (FORMAT CSV, HEADER TRUE, FORCE_QUOTE *, ESCAPE E'\\\\');") do
while row = conn.get_copy_data
csv.push(row)
end …Run Code Online (Sandbox Code Playgroud) 所以我已经在这个网络应用程序上工作了一年,我想编译成一个移植模式,这样我的文本编辑器加载速度更快,git工作目录不是那么混乱.
搜索查找会更快.
任何我的配置/数据库都不会长4000px.
activerecord ruby-on-rails rails-migrations rails-activerecord
我的googlefu必须是弱的,因为我无法找到任何告诉我Rails应用程序中字符串列的默认限制(在Heroku上托管,使用PostgreSQL作为数据库).
任何帮助,将不胜感激!
string postgresql activerecord ruby-on-rails rails-activerecord
在Bryan Helmkamp的优秀博客文章" 7个模式来重构Fat ActiveRecord模型 "中,他提到使用Form Objects抽象多层形式并停止使用accepts_nested_attributes_for.
编辑:请参阅下面的解决方案.
我几乎完全复制了他的代码示例,因为我有同样的问题需要解决:
class Signup
include Virtus
extend ActiveModel::Naming
include ActiveModel::Conversion
include ActiveModel::Validations
attr_reader :user
attr_reader :account
attribute :name, String
attribute :account_name, String
attribute :email, String
validates :email, presence: true
validates :account_name,
uniqueness: { case_sensitive: false },
length: 3..40,
format: { with: /^([a-z0-9\-]+)$/i }
# Forms are never themselves persisted
def persisted?
false
end
def save
if valid?
persist!
true
else
false
end
end
private
def persist!
@account = …Run Code Online (Sandbox Code Playgroud) 我试图弄清楚在activerecord中存储枚举值的最佳方法是什么,但将其转换为"标题"以便在应用中显示.
IE
评论Enum:
UNREVIEWED = {:title => "Unreviewed", :name => "UNREVIEWED"}
REVIEWED = {:title => "Reviewed", :name => "REVIEWED"}
FLAGGED = {:title => "Flagged as inappropriate", :name => "FLAGGED"}
Run Code Online (Sandbox Code Playgroud)
所以在java版本中我习惯在数据库中存储ENUMs名称即(REVIEWED),然后将该名称转换为服务器上的实际枚举,以便我可以在其上调用辅助方法,即:
review = Review.valueOf(review)
review.title()
Run Code Online (Sandbox Code Playgroud)
有没有类似的东西我可以在rails中做到这一点?
仅供参考我们试图保持我们的应用程序超小,所以如果我能够很容易地实现这个或类似的东西没有一个伟大的创业板.
任何"标准"的方式,我想我不是第一个与这个问题斗争的人?
谢谢!
是否有一种开箱即用的方法可以在返回ActiveRecord对象时始终隐藏/删除列(例如,User.password)?谢谢.
activerecord ruby-on-rails ruby-on-rails-3 rails-activerecord
在返回产品搜索结果后,我需要在单个模型期刊上执行搜索.
有没有办法只使用完整字符串的一部分来搜索期刊标题?
def index
@product_results = Gemgento::Search.products(params[:query])
@editorial_results = Journal.where("headline LIKE ?", "#{params[:query]}")
end
Run Code Online (Sandbox Code Playgroud)
例如.假设我的上一个日志对象有标题:"stack overflow blogpost"如果我查询活动记录:
@editorial_results = Journal.where("headline LIKE ?", "stack overflow")
Run Code Online (Sandbox Code Playgroud)
就像我现在一样,它仍然需要在字符串上直接匹配.
通过http://guides.rubyonrails.org/active_record_querying.html搜索似乎这是正确的方法,尽管sql注入的警告.
有没有办法构建搜索,以便它将返回最后一个条目?(不使用搜索库?)
我有以下架构:

我想要选择同时调用proposalsforeign_keys(author_id和editor_id)以及单独的(例如author_proposals和editor_proposals),我需要选择延迟或急切加载它们(例如User.includes(:proposals)或没有它joins).
更新:
#I have the scopes which is like this:
class User < ActiveRecord::Base
has_many :author_proposals, class_name: 'Proposal', foreign_key: :author_id
has_many :editor_proposals, class_name: 'Proposal', foreign_key: :editor_id
end
class Proposal < ActiveRecord::Base
belongs_to :author, class_name: 'User', foreign_key: :author_id
belongs_to :editor, class_name: 'User', foreign_key: :editor_id
end
Run Code Online (Sandbox Code Playgroud)
但我需要一个通用的一个,它会给我所有的提案(包括author_proposals和editor_proposals),这也将跃跃欲试加载它们.我应该使用条件has_many吗?
pg-ruby 允许您一次性向数据库发送多个查询,这有助于最大限度地减少对数据库的访问次数:
results = []
conn.send_query('QUERY1;QUERY2;QUERY3')
conn.block
while result = conn.get_result
results << result
end
Run Code Online (Sandbox Code Playgroud)
鉴于对于result我已经知道的Active Record模型,将结果转换为模型的适当方法是什么?现在我正在做以下事情:
fields = result.fields
models = result.values.map { |value_set|
Model.new(Hash[fields.zip(value_set)])
}
Run Code Online (Sandbox Code Playgroud)
该方法的问题在于,每个Active Record对象看起来都不是#persisted?因为它们已经被实例化了.new.
按照指南,我运行以下命令:
rails g migration CreateSnippetsUsers snippet:belongs_to user:belongs_to
Run Code Online (Sandbox Code Playgroud)
这创建了以下迁移:
class CreateSnippetsUsers < ActiveRecord::Migration[5.0]
def change
create_table :snippets_users do |t|
t.belongs_to :snippet, foreign_key: true
t.belongs_to :user, foreign_key: true
end
end
end
Run Code Online (Sandbox Code Playgroud)
在过去,我见过同样的事情,而index: true不是foreign_key: true.这两者有什么区别?
ruby-on-rails rails-migrations rails-activerecord ruby-on-rails-5