Tag: activerecord

当大型模型存在param时Rails过滤

此博客文章介绍了如何根据此代码中的参数进行过滤。 def index @products = Product.where(nil) # creates an anonymous scope @products = @products.status(params[:status]) if params[:status].present? @products = @products.location(params[:location]) if params[:location].present? @products = @products.starts_with(params[:starts_with]) if params[:starts_with].present? end 解决方案的Product.where(nil)部分是有问题的,因为它会将所有内容加载到内存中,如果模型很大,会导致服务器崩溃。 其中一篇博文评论者说:“使用Product.none而不是Product.where(nil)是不是更好?” 但我无法让这个解决方案奏效。 此Stackoverflow应答通过joins方法访问ActiveRecord::Relation对象。 我没有加入,所以这个解决方案对我不起作用。 让我知道如果有更好的方法来完成这个或完全不同的方式我应该解决这个问题。 谢谢!

如何在Ruby on Rails中有效地使用多个数据库表

我给自己一个小项目来帮助我改进我的ruby on rails编程。 到目前为止,我已完成完整的用户注册和身份validation密码重置,记住我的function和通知电子邮件。 我完全理解发生了什么。 所以我现在已经转移到用户帐户区域,并希望对用户编辑其个人资料的页面进行编码。 我的注册表只询问用户名,电子邮件和密码,因为我想快速注册。 对于用户将编辑其个人资料信息的页面,它将询问他们以下内容: 名字姓氏出生日期的位置它将有关于我个人统计数据的个人资料以及他们的照片 他们应该能够动态更新或更改此信息。 在他们的实际个人资料页面上,它会提取他们的个人资料内容。 我想知道保持井井有条,最好是为这个例如配置文件创建一个单独的表吗? 或者将这些信息存储在数据库的users表中是否明智,例如名字姓? 我正试图找出一种干净的方法来做到这一点,因为稍后我需要添加更多页面,如设置页面等。 这是我第一次使用多个表,我知道如何做但不太确定。 任何建议,如简要说明如何实现这一点,将不胜感激。 问候

Rails after_save回调被多次调用

我试图通过mixin注入一个after_save回调,但我的rspec测试告诉我,当调用create方法时,回调被调用两次。 为什么方法被调用两次? 以下rspec测试失败 it ‘should call callback’ do Product.any_instance.should_receive(:update_linkable_attachments).once Product.create(:name=>’abc’) end 失败消息是: Failure/Error: Unable to find matching line from backtrace (#).update_linkable_attachments(any args) expected: 1 time received: 2 times 这是代码 module MainModuleSupport def self.included(base) base.instance_eval(“after_save :update_linkable_attachments”) end def update_linkable_attachments LinkedAttachment.delay.create_from_attachment self end end class Product < ActiveRecord::Base include MainModuleSupport … end Product类有其他代码,但没有任何其他回调。

有效地在同一模型上执行多个查询

我已经绕圈子试了几天试图解决我过去一直在努力解决的问题。 基本上它是理解在模型上执行多个查询的最佳(或有效)方法的问题,因为我经常查找我的页面加载非常慢。 考虑一下你有一个名为Everything的模型的情况。 最初,您执行查询,在Everything查找符合特定条件的记录 @chosenrecords = Everything.where(‘name LIKE ?’, ‘What I want’).order(‘price ASC’) 我想记住@chosenrecords的内容,因为我会将它们作为列表呈现给用户,但是,我还想了解更多@chosenrecords的属性,例如 @minimumprice = @chosenrecords.first @numberofrecords = @chosenrecords.count 当我在我的控制器中使用上面的代码并检查本地服务器上的命令历史记录时,我很惊讶地发现三个查询中的每一个都涉及原始Everything模型上的SQL查询,而不是记住@chosenrecords返回的记录。对此执行查询。 这对我来说效率非常低,实际上三个查询中的每一个都需要相同的时间来处理,从而使页面执行缓慢。 我在使用MATLAB等软件编写代码时更有经验,一旦你计算了变量的值,就可以在本地存储并快速查询,而不是在每次想要了解更多信息时重新计算该变量。 请问你能指导一下我是否完全走错了轨道,而且我发现的问题只是“它是如何在Rails中”,或者我是否可以做些什么来改进它。 我已经研究过像使用作用域,定义不同的变量类型和缓存这样的概念,但我不太清楚我在每种情况下做了什么,并且最终会陷入类似的漏洞。 谢谢你的时间

Rails accepted_nested_attributes_for错误,请帮我发现它

我一直在尝试遵循Active Record Nested Attributes Guide ,但没有取得多大成功。 我有以下型号: class Contact < ActiveRecord::Base has_many :telephones accepts_nested_attributes_for :telephones end class Telephone < ActiveRecord::Base belongs_to :contact end 在尝试创建联系人时: contact = { :name => “John”, :telephones => [ {:telephone => ‘787445741’}, {:telephone => ‘478589658’} ] } Contact.create(contact) 我收到以下错误: ActiveRecord::AssociationTypeMismatch: Telephone(#80827590) expected, got Hash(#72886250) 你能帮我看看错误吗? 我应该在contact_controller.rb包含任何代码吗?

Ruby on Rails:为什么ActiveRecord使用“datetime”类型而不是“timestamp”来表示时间戳字段?

在我的数据库迁移文件中,我插入了以下行: t.timestamps 正如我所料,创建了两列:“updated_at”和“created_at”。 但是,它们的类型是“datetime”而不是“timestamp”。 我正在使用MySQL和“timestamp”类型,据我所知,它是专门为这种情况设计的 ,因为它占用的空间更少,并且与时区无关。 那么,有什么理由,为什么Rails 3使用“datetime”而不是“timestamp”? 我应该尝试解决这个问题吗? 如果是,除了不使用“t.timestamps”并且每次为每个新表分别定义“updated_at”和“created_at”列时,有没有办法做到这一点?

validationRspec和Rails中的布尔值

我很困惑如何validationRspec和Rails中的布尔值。 我理解除了false和nil之外的所有内容在Ruby中都是true的。 但是当我使用MySQL和Rails时,它使用1表示true , 0表示false (如果我的理解是正确的话)。 我有以下型号规格。 我想测试superuser属性的布尔值。 我怎么在这里写规格? 我怎么在这里编写实现代码? 我的规范和实现代码是否特定于特定数据库(如MySQL和PostgreSQL)? require ‘spec_helper’ describe User do before(:each) do @valid_attributes = { :username => “mike”, :password => “super_encryped_password”, :email => “mike@example.com”, :superuser => true } end it “should create a new instance given valid attributes” do User.create!(@valid_attributes) end it “should have true or false for superuser” […]

Rails 3,锁定拍卖类型引擎上的表格

我正在Rails 3中构建类似拍卖的系统(使用PostgreSQL作为数据库)。 想象一下,你有一个产品。 产品有很多出价。 我担心当两个不同的用户同时点击“出价”时会发生什么(假设我至少有2个应用服务器,并且他们同时点击服务器)。 我有两个可接受的行为: 其中一个“胜利”,另一个收到错误消息 其中一个“胜利”,另一个出价是下一个(每个出价加上0.01欧元的价格)。 因此,重复所有并​​发出价直到创建 所以我的问题是:如何在Rails 3上处理这个问题? 我认为使用常规交易还不够,或者是这样吗?

轨道中的N + 1与活动记录的关系?

我有四个型号 组 报告 评论 用户 Group => has_many =>报告 Report => has_many =>评论 Comment => Belongs_to =>用户 当我想展示一个团体时,我会做类似的事情 在这种情况下解决N + 1查询问题的最佳方法是什么?

Rails:按两列的总和排序

所以,我有一个Photo模型,可以在full_size和presentation_size下载。 当用户下载照片时,我会在照片的full_downloads和presentation_downloads属性上对其进行跟踪。 这一切都很好。 有时我想知道有多少下载量。 我有一个简单的方法, total_downloads看起来像这样: def total_downloads self.full_downloads + self.presentation_downloads end 我的问题是:我希望能够通过所有这三个(完整,演示,总下载)订购照片。 前两个很容易,但是你如何通过两列的总和来做订单呢? 请注意,这至少需要SQLite和PG兼容。 一个附带问题,将total_downloads方法作为查询会更快吗?如果是这样,最好的方法是什么呢? 我知道总结你可以调用Photo.sum(…) ,但我不知道如何在一条记录上为两列做到这一点。 谢谢!