标签: rails-activerecord

Rails原始查询csv格式,通过控制器返回

我正在使用活动记录来获取我的故事,然后生成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)

csv postgresql pg ruby-on-rails-4 rails-activerecord

14
推荐指数
1
解决办法
3360
查看次数

什么是在Rails中清理迁移的好方法?

所以我已经在这个网络应用程序上工作了一年,我想编译成一个移植模式,这样我的文本编辑器加载速度更快,git工作目录不是那么混乱.

搜索查找会更快.

任何我的配置/数据库都不会长4000px.

activerecord ruby-on-rails rails-migrations rails-activerecord

13
推荐指数
3
解决办法
4794
查看次数

rails 3/postgres - 如果不应用,则为字符串多长时间:模式中的限制

我的googlefu必须是弱的,因为我无法找到任何告诉我Rails应用程序中字符串列的默认限制(在Heroku上托管,使用PostgreSQL作为数据库).

任何帮助,将不胜感激!

string postgresql activerecord ruby-on-rails rails-activerecord

13
推荐指数
2
解决办法
6979
查看次数

在ActiveModel对象上,如何检查唯一性?

在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)

validation ruby-on-rails activemodel rails-activerecord

13
推荐指数
2
解决办法
6224
查看次数

在ActiveRecord中存储枚举值并转换为字符串以进行显示的最佳方法

我试图弄清楚在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中做到这一点?

仅供参考我们试图保持我们的应用程序超小,所以如果我能够很容易地实现这个或类似的东西没有一个伟大的创业板.

任何"标准"的方式,我想我不是第一个与这个问题斗争的人?

谢谢!

ruby-on-rails rails-activerecord

13
推荐指数
3
解决办法
2万
查看次数

ActiveRecord:返回对象时隐藏列

是否有一种开箱即用的方法可以在返回ActiveRecord对象时始终隐藏/删除列(例如,User.password)?谢谢.

activerecord ruby-on-rails ruby-on-rails-3 rails-activerecord

13
推荐指数
3
解决办法
3443
查看次数

搜索列中部分字符串的活动记录

在返回产品搜索结果后,我需要在单个模型期刊上执行搜索.

有没有办法只使用完整字符串的一部分来搜索期刊标题?

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注入的警告.

有没有办法构建搜索,以便它将返回最后一个条目?(不使用搜索库?)

ruby-on-rails rails-activerecord

13
推荐指数
1
解决办法
6484
查看次数

使用两个外键确定范围

我有以下架构: 在此输入图像描述

我想要选择同时调用proposalsforeign_keys(author_ideditor_id)以及单独的(例如author_proposalseditor_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_proposalseditor_proposals),这也将跃跃欲试加载它们.我应该使用条件has_many吗?

ruby activerecord ruby-on-rails rails-activerecord

13
推荐指数
2
解决办法
718
查看次数

将PG :: Result转换为Active Record模型

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.

ruby ruby-on-rails rails-activerecord

13
推荐指数
1
解决办法
2868
查看次数

index:true vs foreign_key:true(Rails)

按照指南,我运行以下命令:

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

13
推荐指数
2
解决办法
9280
查看次数