小编use*_*882的帖子

如何为我的rspec测试加速创建5,000条记录?

我使用Ruby on Rails 3.2.2,FactoryGirl 3.1.0,FactoryGirlRails 3.1.0,Rspec 2.9.0和RspecRails 2.9.0.为了测试我的应用程序,我必须在数据库中创建大量记录(大约5000个),但该操作非常慢(创建记录需要10分钟以上).我这样做:

before(:each) do
  5000.times do
    FactoryGirl.create(:article,)
  end
end
Run Code Online (Sandbox Code Playgroud)

如何改进我的规范代码以便更快?

注意:在每篇文章创建过程之前和之后运行的文章回调可能会导致缓慢,但我可以跳过那些(因为我必须测试的唯一内容是文章而不是关联的模型),如果那些记录的创建缓慢......是否有可能做到这一点,是否是正确的方法?

ruby testing rspec ruby-on-rails ruby-on-rails-3

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

是否可以"动态"加入表,只有该表尚未加入?

我正在使用Ruby on Rails 3.2.2,我想知道是否在范围方法中,只有当该表尚未连接时才能"动态"连接表.它,我有:

def self.scope_method_name(user)
  joins(:joining_association_name).where("joining_table_name.user_id = ?", user.id)
end
Run Code Online (Sandbox Code Playgroud)

我想做类似以下的事情:

# Note: the following code is just a sample in order to understand what I mean.
def self.scope_method_name(user)
  if table_is_joined?(joining_table_name)
    where("joining_table_name.user_id = ?", user.id)
  else
    joins(:joining_association_name).where("joining_table_name.user_id = ?", user.id)
  end
end
Run Code Online (Sandbox Code Playgroud)

是否有可能/建议这样做?如果是这样,我该怎么做?


我想使用这种方法,以避免SQL查询INNER JOIN的多个数据库表语句(在某些情况下,它似乎使我的SQL查询不能按预期工作,因为多个表语句),所以使用scope_method_name不关心相关的SQL查询问题(就我而言,没有关心加入数据库表).

:它可以提高SQL错误(例如,错误,样" ActiveRecord::StatementInvalid: Mysql2::Error: Unknown column 'joining_table_name.user_id' in 'where clause'"),当你有没有加入尚未数据库表(例如,这可能当你喜欢上运行的代码发生ClassName.scope_method_name(@user) 没有以前加入joining_association_name,因此没有加入相关joining_table_name表).

ruby conditional join ruby-on-rails ruby-on-rails-3

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

如何检索当前方法名称以便将其输出到记录器文件?

我正在使用Ruby on Rails 3.2.2,为了显示警告消息以用于开发目的,我logger.warn在我的代码中使用.我想检索运行它的方法名称,logger.warn以便将该方法名称输出到日志文件中.

class ClassName < ActiveRecord::Base
  def method_name
    # Note: This code doesn't work. It is just a sample.
    logger.warn "I would like to retrieve and display the #{self.class.to_s}##{method_name}"
  end
end
Run Code Online (Sandbox Code Playgroud)

在日志文件中我想看到:

我想检索并显示ClassName#method_name

可能吗?如果是这样,我该怎么做?

ruby methods

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

如何使用Arel使用'或'和'和'子句正确添加括号到SQL查询?

我正在使用Ruby on Rails 3.2.2,我想生成以下SQL查询:

SELECT `articles`.* FROM `articles` WHERE (`articles`.`user_id` = 1 OR `articles`.`status` = 'published' OR (`articles`.`status` = 'temp' AND `articles`.`user_id` IN (10, 11, 12, <...>))) 
Run Code Online (Sandbox Code Playgroud)

通过这种方式使用Arel

Article
 .where(
   arel_table[:user_id].eq(1)
   .or(arel_table[:status].eq("published"))
   .or(
     arel_table[:status].eq("temp")
     .and(
       arel_table[:user_id].in(10, 11, 12, <...>)
     )
  )
)
Run Code Online (Sandbox Code Playgroud)

它会生成以下内容(注意:括号与第一个SQL查询不同):

SELECT `articles`.* FROM `articles` WHERE (((`articles`.`user_id` = 1 OR `articles`.`status` = 'published') OR `articles`.`status` = 'temp' AND `articles`.`user_id` IN (10, 11, 12, <...>))) 
Run Code Online (Sandbox Code Playgroud)

由于我认为后一个SQL查询不能作为第一个"工作",我怎么能使用Arel(或者,可能还有别的东西)来生成SQL查询作为第一个?

更新(评论后)

鉴于上面的SQL查询"工作"相同,但我仍然希望生成确切的SQL查询作为问题中的第一个(主要原因是第一个SQL查询比第一个SQL查询更可读一个用得少而且"明确"括号),我怎么能用Arel来做到这一点?

ruby sql ruby-on-rails arel ruby-on-rails-3

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

'case'语句如何与常量一起使用?

我使用的是Ruby 1.9.2和Ruby on Rails 3.2.2.我有以下方法:

# Note: The 'class_name' parameter is a constant; that is, it is a model class name.
def my_method(class_name)
  case class_name
  when Article then make_a_thing
  when Comment then make_another_thing
  when ...     then ...     
  else raise("Wrong #{class_name}!")
  end  
end
Run Code Online (Sandbox Code Playgroud)

我想理解为什么在case上面的语句中,else当我执行类似的方法调用时,它始终运行"部分" my_method(Article),my_method(Comment)依此类推.

我该如何解决这个问题?有人有建议如何处理这个?

ruby class constants switch-statement

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

如何从另一个参数引用一个参数(“@param”标签)?

我使用 Ruby on Rails 3.1.0 和YARD 0.7.4 gem 进行文档处理。我想从另一个参数引用一个参数@param标签)。也就是说,我有:

# ...
#
# @param [String] argument_1
#   Here I would like to have a description text with a reference/link to the
#   'argument_2' parameter (see below)...
#
#   Maybe here I can use something like '@param', '{}' or '@macro'... but, how?
#
# @param [String] argument_2
#   Some description text...
#
def method_name(argument_1, argument_2)
  ...
end
Run Code Online (Sandbox Code Playgroud)

是否可以?如果是这样,我该怎么做?

ruby documentation ruby-on-rails reference yard

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

如何在Ajax请求时解决Firebug的"Aborted"消息?

我在Firefox 14.0.1中使用Firebug 1.10.2.在显示网页时,Firebug插件有这种"行为":在Ajax请求时Firebug的"Aborted"消息.

我该怎么办?我是否必须改进我的Web应用程序是因为存在某些错误,或者是Firebug错误还是别的什么?

debugging ajax firefox firebug

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

如何重构"共享"方法?

我正在使用Ruby on Rails 3.2.2,我想从我的模型/类中"提取"一些方法.也就是说,在多个类/模型中,我有一些方法(注意:方法与用户授权有关,并被命名为" CRUD方式"),它们的工作方式基本相同; 所以我认为DRY方法是将这些方法放在"共享"模块或类似的东西中.

实现这一目标的常见和正确方法是什么?例如,我应该在哪里(在哪些目录和文件中)放置"共享"代码?如何在我的类/模型中包含提到的方法?你有什么建议吗?

注意:我正在寻找"Ruby on Rails方法来制造东西".

ruby methods refactoring ruby-on-rails ruby-on-rails-3

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

避免使用第三方宝石是正确的吗?

我正在使用Ruby on Rails 3.2.2.我想知道以下的想法(从我之前的问题出生)是否正确:

我倾向于不使用第三方宝石(至少在可能和合理的情况下),因为它们可能随时被抛弃.此外,如果Ruby on Rails框架发生变化,我可能必须等待更新这些宝石才能将我的应用程序更新到最新的RoR版本.

ruby gem ruby-on-rails ruby-on-rails-3

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

如何正确地将值数组传递给`attr_accessible`方法?

我正在使用Ruby on Rails v3.2.2并且我想处理一个符号数组,以便将其值传递给attr_accessible方法以及它应该被创建.也就是说,我有:

attr_array = [:one, :two, ...]
Run Code Online (Sandbox Code Playgroud)

如果我使用:

attr_accessible attr_array
Run Code Online (Sandbox Code Playgroud)

我得到以下内容:

self.accessible_attributes.inspect
# => #<ActiveModel::MassAssignmentSecurity::WhiteList: {"[:one, :two, ..."]}>
Run Code Online (Sandbox Code Playgroud)

但是,我想得到:

# => #<ActiveModel::MassAssignmentSecurity::WhiteList: {"one", "two", "..."}>
Run Code Online (Sandbox Code Playgroud)

以及应该做的.

我该怎么做?

ruby arrays ruby-on-rails attr-accessible ruby-on-rails-3

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