我使用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 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 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 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 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 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)
是否可以?如果是这样,我该怎么做?
我在Firefox 14.0.1中使用Firebug 1.10.2.在显示网页时,Firebug插件有这种"行为":在Ajax请求时Firebug的"Aborted"消息.
我该怎么办?我是否必须改进我的Web应用程序是因为存在某些错误,或者是Firebug错误还是别的什么?
我正在使用Ruby on Rails 3.2.2.我想知道以下的想法(从我之前的问题出生)是否正确:
我倾向于不使用第三方宝石(至少在可能和合理的情况下),因为它们可能随时被抛弃.此外,如果Ruby on Rails框架发生变化,我可能必须等待更新这些宝石才能将我的应用程序更新到最新的RoR版本.
我正在使用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)
以及应该做的.
我该怎么做?