小编Nat*_*han的帖子

将对象数组转换为ActiveRecord :: Relation

我有一个对象数组,我们称之为Indicator.我想def self.subjects在这个数组上运行Indicator类方法(变种类,范围等).我知道在一组对象上运行类方法的唯一方法是让它们成为ActiveRecord :: Relation.所以我最终要求添加一个to_indicators方法Array.

def to_indicators
  # TODO: Make this less terrible.
  Indicator.where id: self.pluck(:id)
end
Run Code Online (Sandbox Code Playgroud)

有时我会链接相当多的这些范围来过滤类方法中的结果.所以,即使我在ActiveRecord :: Relation上调用一个方法,我也不知道如何访问该对象.我只能通过它来获取它的内容all.但是all是一个数组.那么我必须将该数组转换为ActiveRecord :: Relation.例如,这是其中一种方法的一部分:

all.to_indicators.applicable_for_bank(id).each do |indicator|
  total += indicator.residual_risk_for(id)
  indicator_count += 1 if indicator.completed_by?(id)
end
Run Code Online (Sandbox Code Playgroud)

我想这可以归结为两个问题.

  1. 如何将对象数组转换为ActiveRecord :: Relation?最好不要where每次都做.
  2. def self.subjectsActiveRecord :: Relation上运行类型方法时,如何访问ActiveRecord :: Relation对象本身?

谢谢.如果我需要澄清任何事情,请告诉我.

ruby activerecord ruby-on-rails

93
推荐指数
3
解决办法
6万
查看次数

Bundler将我的宝石放在我的项目目录中

我在Ruby 1.9.2上有一个Rails 3rc应用程序工作正常,但Bundler在我的项目目录中不断创建一个名为"bandsintown"的文件夹(bandsintown是我使用的gem).据我所知,该文件夹中包含了我的所有宝石.我很确定这从未发生过.这是正常的行为吗?

我认为这可能会干扰运行测试.我得到一个"命令失败并显示状态(1)"错误,然后它几次提到"bandsintown"文件夹.

我觉得奇怪的是Bundler将文件夹命名为"bandsintown",即使我在gemfile中注释掉了这个gem.在那个文件夹中有一个"ruby"文件夹,在"ruby"文件夹中有一个"1.9.1"文件夹.当我使用1.9.2时,我不明白为什么它说1.9.1.1.9.1文件夹里面有bin,bundler,cache,doc,gems和specification文件夹.

我用所有相同的宝石制作了一个testapp并进行了捆绑安装.它不会创建一个包含所有宝石的新文件夹.

无论如何,我的应用程序工作正常,但我很感激,如果有人可以帮助我在这里.如果我遗漏任何需要知道的信息,请告诉我.谢谢.

ruby gem ruby-on-rails bundler

16
推荐指数
1
解决办法
5993
查看次数

无法打开rails console:生成数据库未配置,establish_connection引发ActiveRecord :: AdapterNotSpecified

我的应用程序在生产中非常完美 - 至少是网站的一部分.当我通过SSH连接到我的VPS并执行"rails c RAILS_ENV = production"时,问题才会出现.控制台在开发模式下工作正常.

我之前遇到过这个问题(或者至少有一个看起来像这个问题)并通过向database.yml添加"reconnect:true"来解决这个问题 - 但这次没有修复它.这是错误输出的开始:

/home/tour/.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.0.0/lib/active_record/connection_adapters/abstract/connection_specification.rb:62:in `establish_connection': RAILS_ENV=production database is not configured (ActiveRecord::AdapterNotSpecified)
from /home/tour/.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.0.0/lib/active_record/connection_adapters/abstract/connection_specification.rb:55:in `establish_connection'
from /home/tour/.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.0.0/lib/active_record/railtie.rb:59:in `block (2 levels) in <class:Railtie>'
from /home/tour/.rvm/gems/ruby-1.9.2-p0/gems/activesupport-3.0.0/lib/active_support/lazy_load_hooks.rb:36:in `instance_eval'
from /home/tour/.rvm/gems/ruby-1.9.2-p0/gems/activesupport-3.0.0/lib/active_support/lazy_load_hooks.rb:36:in `execute_hook'
from /home/tour/.rvm/gems/ruby-1.9.2-p0/gems/activesupport-3.0.0/lib/active_support/lazy_load_hooks.rb:26:in `on_load'
from /home/tour/.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.0.0/lib/active_record/railtie.rb:57:in `block in <class:Railtie>'
from /home/tour/.rvm/gems/ruby-1.9.2-p0/gems/railties-3.0.0/lib/rails/initializable.rb:25:in `instance_exec'
from /home/tour/.rvm/gems/ruby-1.9.2-p0/gems/railties-3.0.0/lib/rails/initializable.rb:25:in `run'
from /home/tour/.rvm/gems/ruby-1.9.2-p0/gems/railties-3.0.0/lib/rails/initializable.rb:50:in `block in run_initializers'
Run Code Online (Sandbox Code Playgroud)

对于我的生产数据库设置:

production:
  adapter: mysql
  encoding: utf8
  database: tour_production
  pool: 5
  username: [user]
  password: [password]
  socket: /var/run/mysqld/mysqld.sock
  reconnect: true
Run Code Online (Sandbox Code Playgroud)

我无法理解为什么它通过乘客工作,但没有运气控制台.无论如何,我使用的是Rails 3,Ruby 1.9.2,Passenger和Nginx.

我一直在通过Runner做一些小事,这很烦人.我想解决这个问题.所以,谢谢你的帮助.

mysql console activerecord ruby-on-rails

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

MiniProfiler没有显示在页面上

我在让MiniProfiler向我展示报告方面遇到了问题.我只是在Dev环境中,它应该一直显示它.添加?pp=help确实会显示帮助页面.在tmp/miniprofile中,有大量的mp_timers_文件.显然有些事情发生在那里.

起初我认为这是一个奇怪的CSS问题,就像我的导航栏覆盖它一样.我尝试加载没有CSS的页面,MiniProfile框仍然没有出现.

如果重要,我没有before_filter设置.但是,当我使用他们的文档中的简单文件时,它没有任何帮助.

ruby-on-rails mvc-mini-profiler

8
推荐指数
2
解决办法
2727
查看次数

终端说delayed_job开始,但没有做任何事情

我有一个应用程序在我的本地机器上完美运行,现在正在部署它.我有VPS全部设置,它也非常有效.我的问题来自无法启动delayed_job.我做了"ruby脚本/ delayed_job启动RAILS_ENV =生产",同时SSHd到应用程序,它返回"delayed_job:进程与pid 11547开始." 当我在htop中查找过程时,我找不到它.

所以我挖了一遍,读到Monit可以保持delayed_job继续.我把它设置了,希望我能以这种方式启动delayed_job.但是没有delayed_job.pid,所以我没有走得太远.我最终在其中设置了nginx和mysql,并且想完成设置delayed_job.缺少delayed_job.pid会妨碍.

当我通过SSH连接到应用程序并运行"rake jobs:work RAILS_ENV = production"时,一切正常.所以我很确定应用程序本身很好.

我正在使用collectiveidea的delayed_job.谢谢你的帮助.

ruby-on-rails monit delayed-job

2
推荐指数
1
解决办法
1695
查看次数

即使字段不为空,验证字段的存在也会失败

我正在尝试使用复选框中的值填充数组.它在创建记录时工作得很好,但在编辑时验证失败.params看起来正确,这让我感到困惑:

"record"=>{... "type_array"=>["accounting"], ...}
Run Code Online (Sandbox Code Playgroud)

它与创建新记录时的参数看起来相同.在该领域New.html.erb,并Edit.html.erb也使用相同的标记.

Edit.html.erb

<div class="field">
  <%= f.label :type_array, "What type of record?" %><br />
  <% ["accounting", "agriculture", "automotive"].each do |type| %>
    <%= check_box_tag 'record[type_array][]', type, (true if @record.type_list.include? type),
                      :id => type %>
    <%= label_tag type, type.titleize, :class => type %><br />
  <% end %>
</div>
Run Code Online (Sandbox Code Playgroud)

Record.rb的部分内容

validates :type_array, :presence => true
attr_accessor :type_array
attr_accessible :type_array
before_validation :set_type_list

private

def set_type_list
  self.type_list = type_array.join ',' if type_array.present?
end
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?当我删除type_array验证并填写表单时,它的行为类似于type_array为空.沿着这条线的某个地方,它必定是丢失的东西.

我感谢任何帮助.

(旁注:如果有人有更好的方法来做复选框列表,请告诉我)

validation activerecord ruby-on-rails

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

如果用户已登录,请设置其他Rails模板

我试图在用户登录时将布局设置为"私有".如果我可以执行以下操作,那将是完美的:

layout 'private' if current_user
Run Code Online (Sandbox Code Playgroud)

除了它给出了这个错误:

undefined local variable or method `current_user' for ApplicationController:Class
Run Code Online (Sandbox Code Playgroud)

我也尝试在应用程序控制器中执行此操作:

before_filter :pick_the_layout

def pick_the_layout
  if current_user
    render :layout => "private"
  else
    render :layout => "public"
  end
end
Run Code Online (Sandbox Code Playgroud)

这也没有运气,这是有道理的.谁能想到更好的方法来做到这一点?

layout templates ruby-on-rails

0
推荐指数
1
解决办法
3037
查看次数