我在 mysql 下通过了以下测试(使用 FactoryGirl):
test "order by title" do
@library = create(:drawing_library, title: 'Accessories')
@drawing = create(:drawing, drawing_library: @library, title: 'Test Drawing')
create(:drawing, drawing_library: @library, title: 'z')
create(:drawing, drawing_library: @library, title: 'm')
create(:drawing, drawing_library: @library, title: 'b')
str = ''
@library.drawings.each do |dwg|
str += dwg.title
end
assert_equal 'bmTest Drawingz', str
end
Run Code Online (Sandbox Code Playgroud)
绘图模型为:
class Drawing < ActiveRecord::Base
belongs_to :drawing_library
default_scope order: :title
..
end
Run Code Online (Sandbox Code Playgroud)
在 postgresql 下,此测试现在失败并显示:
<"bmTest Drawingz"> expected but was
<"Test Drawingbmz">.
Run Code Online (Sandbox Code Playgroud)
这似乎是因为“测试绘图”中的 T 是大写的。如果我将其更改为“测试绘图”,则测试通过。
有没有办法使default_scope order …
ruby postgresql activerecord ruby-on-rails rails-activerecord
在 Ruby 中,我有一个测试,它是Postgres(实际上是 Greenplum)数据库中的子类ActiveSupport::TestCase并通过子类访问表。ActiveRecord对于特定的测试,我需要在表中填充大约一百万行,但我并不真正关心其中有什么。我可以做类似的事情
for i in 1...1000000 do
MyTable.create(:column1 => 'value', :column2 => 'value')
end
Run Code Online (Sandbox Code Playgroud)
但这需要很长时间才能运行。我可以通过将其包装在事务中来使其更快一点,这样就create不会每次都创建一个新事务,但这只会节省很多时间。
有没有一些好的方法可以做到这一点,这样我就不必在表中执行大量的虚假值插入?
(注意:尝试假装该表包含一百万条记录的存根是行不通的,因为我稍后需要与实际行进行交互;对于这个特定的测试,我只是不关心它们是什么)
我在示例 Rails 应用程序中使用 sqlite db。从我的用户表中,我已使用 清除了所有记录User.delete_all。但现在每当我使用 向表中插入新记录时User.create,id 的起始值都会比表中最后一条记录的 id 大 1。例如,如果我的表有 5 条记录,并且我清除了所有记录,那么当我执行 User.create 时,它从 id 6 开始。有什么方法可以使 id 再次从 1 开始吗?
谢谢
我最近一直在制作一家印刷店网站。我现在在开发高效的数据库模式时遇到了麻烦。
我的应用程序是一家印刷店,为海报、名片和传单等提供定制印刷品。我面临的问题是开发产品选项的架构。这是一个场景:名片可以有“尺寸”和“材质”选项。“尺寸”可以是“3.5x2.5 英寸”或“3.25x2.25 英寸”。同样,“材料”可以是“300 gsm 卡片纸”或“200 gsm 卡片纸”。现在我的商店提供的是选项和数量组合的价格。
喜欢,
100 Business Cards + 3.5x2.5 inch + 300 gsm Card Stock = $500.00
或者
200 Business Cards + 3.5x2.5 inch + 300 gsm Card Stock = $800.00。
这里需要注意的一点是,“传单”和“海报”产品的“尺寸”选项是不同的。所以“3.5x2.5”的海报没有意义。海报产品将有自己的尺寸。价格始终与期权组合绑定,没有期权组合的产品没有单独的价格。
其次,也有基于重量的运输。所以我也想知道,权重存储在数据库的哪里?
请提供一些有关设计此类数据库的见解。另外,我想要一种基于 ActiveRecord 的方法,因为我在 EAV 建模方面太弱了。
我有两个模型,Submission(父母)和SubmissionDetail(孩子)。Submission有一个名为 的字段status,该字段可以是“未完成”、“待定”、“已批准”或“已拒绝”。当您创建新的 时Submission,status会自动设置为不完整。孩子的外键为:submission_id.
我希望发生的是,当SubmissionDetail创建新的时,其父级的状态将自动更改为“待处理”。不知道该怎么做。例如,我touch在模型中读过一些内容,但我认为这不适用于此处。
我尝试将用户类型更改为“nil”,但现在不断收到此错误消息:
单表继承机制无法定位子类:'nil'。引发此错误的原因是“type”列被保留用于在继承时存储类。如果您不打算将此列用于存储继承类,请重命名该列,或覆盖 User.inheritance_column 以使用另一列来存储该信息。
from /usr/local/rvm/gems/ruby-2.0.0-p481@rails-4.0.2/gems/activerecord-4.1.1/lib/active_record/inheritance.rb:161:in `rescue in find_sti_class'
from /usr/local/rvm/gems/ruby-2.0.0-p481@rails-4.0.2/gems/activerecord-4.1.1/lib/active_record/inheritance.rb:155:in `find_sti_class'
from /usr/local/rvm/gems/ruby-2.0.0-p481@rails-4.0.2/gems/activerecord-4.1.1/lib/active_record/inheritance.rb:144:in `discriminate_class_for_record'
from /usr/local/rvm/gems/ruby-2.0.0-p481@rails-4.0.2/gems/activerecord-4.1.1/lib/active_record/persistence.rb:50:in `instantiate'
from /usr/local/rvm/gems/ruby-2.0.0-p481@rails-4.0.2/gems/activerecord-4.1.1/lib/active_record/querying.rb:48:in `block in find_by_sql'
from /usr/local/rvm/gems/ruby-2.0.0-p481@rails-4.0.2/gems/activerecord-4.1.1/lib/active_record/result.rb:55:in `block in each'
from /usr/local/rvm/gems/ruby-2.0.0-p481@rails-4.0.2/gems/activerecord-4.1.1/lib/active_record/result.rb:55:in `each'
from /usr/local/rvm/gems/ruby-2.0.0-p481@rails-4.0.2/gems/activerecord-4.1.1/lib/active_record/result.rb:55:in `each'
from /usr/local/rvm/gems/ruby-2.0.0-p481@rails-4.0.2/gems/activerecord-4.1.1/lib/active_record/querying.rb:48:in `map'
from /usr/local/rvm/gems/ruby-2.0.0-p481@rails-4.0.2/gems/activerecord-4.1.1/lib/active_record/querying.rb:48:in `find_by_sql'
from /usr/local/rvm/gems/ruby-2.0.0-p481@rails-4.0.2/gems/activerecord-4.1.1/lib/active_record/relation.rb:603:in `exec_queries'
from /usr/local/rvm/gems/ruby-2.0.0-p481@rails-4.0.2/gems/activerecord-4.1.1/lib/active_record/relation.rb:487:in `load'
from /usr/local/rvm/gems/ruby-2.0.0-p481@rails-4.0.2/gems/activerecord-4.1.1/lib/active_record/relation.rb:231:in `to_a'
from /usr/local/rvm/gems/ruby-2.0.0-p481@rails-4.0.2/gems/bullet-4.13.1/lib/bullet/active_record41.rb:10:in `to_a'
from /usr/local/rvm/gems/ruby-2.0.0-p481@rails-4.0.2/gems/activerecord-4.1.1/lib/active_record/relation/finder_methods.rb:479:in `find_last'
from /usr/local/rvm/gems/ruby-2.0.0-p481@rails-4.0.2/gems/activerecord-4.1.1/lib/active_record/relation/finder_methods.rb:165:in `last'
Run Code Online (Sandbox Code Playgroud)
我明白为什么会发生这种情况,并且我确实希望发生单表继承,但它甚至不允许我覆盖它 Rails Console。我正在尝试将用户类型更改回我需要的类型,它立即给我该消息。即使我执行 User.find( myID ) 它也不会提取我的数据。
有什么办法我可以告诉它覆盖它并更改类型吗?
编辑:
我试过:
User.last (I was the last user)
User.find(*myId*)
Run Code Online (Sandbox Code Playgroud)
它甚至不让我做User.last.destroyor User.destroy_all,每次在控制台中都会给我同样的错误。 …
我的 Postgresql 数据库具有以下结构:
TABLE Orders
id (string)
userId (string)
prodId (string)
value (integer)
Run Code Online (Sandbox Code Playgroud)
这是一个数据示例:
id userId prodId value
1 a@a.aaa prod1 5
2 b@b.bbb prod1 -1
3 a@a.aaa prod1 -4
4 a@a.aaa prod2 9
Run Code Online (Sandbox Code Playgroud)
我想从 ActiveRecord 执行一个查询,对特定的所有值进行求和userId,因此 (a@a.aaa) 的查询将返回如下所示的 LIST:
prod1 1
prod2 9
Run Code Online (Sandbox Code Playgroud)
我的第一个方法是这个,但它不起作用:
orderList = Orders.select("SUM(orders.amount) AS num_prods").where((:userId => HERE_USER_ID).group(:prodId)
Run Code Online (Sandbox Code Playgroud)
编辑:由于反馈而重新措辞
我正在创建一个原始 SQL upsert,并且有相当大的 ActiveRecord 关系数组,需要将其转换为哈希值。我需要将哈希值与我选择的参数之一联系起来,以便我可以快速获取该值。
我使用 as_json 找到了这个响应,我几乎可以使用它得到我需要的东西,但它并不完全在那里。
profiles = Profile.all.select(:id, :foo) #returns an array of ActiveRecord Relations
profiles = profiles.as_json
Run Code Online (Sandbox Code Playgroud)
产量
{:id => 123, :foo => "bar"}
{:id => 456, :foo => "baz"}
Run Code Online (Sandbox Code Playgroud)
但我想要的是
{123 => "bar", 456 => "baz"}
Run Code Online (Sandbox Code Playgroud)
我意识到我可以将 as_json 的结果映射到新的哈希,但我必须在几百万条记录上相当频繁地运行它。这也是更大的 rake 任务的一小部分,我想继续循环所有记录到最小限度。
我手动完成这一切而不是让 ActiveRecord 处理的原因是,运行该任务最初需要 24 小时以上,甚至使用activerecord-import也只能将其速度加快到约 12 小时。我选择根据这篇博文中的基准使用原始 SQL
我有一个返回活动记录关系的模型。如何将此活动记录关系转换为普通的 ruby 数组?
select user_id, max(perception_score) as max, min(perception_score) as min from temp_user_notes group by user_id as t1;
Run Code Online (Sandbox Code Playgroud)
我正在尝试在 Rails Active Record 中转换此 sql 查询,但很难创建别名
activerecord ×10
ruby ×5
postgresql ×3
arrays ×1
database ×1
greenplum ×1
hash ×1
mysql ×1
sql ×1
sqlite ×1