Tag: activerecord

如何最好地清理轨道上的ruby中的字段

我目前有一个控制器从前端的TinyMCE捕获一些html。 如果我修改了firebug,则可以向屏幕提交脚本标记并注入警报消息等。 编辑:目前我正在使用sanitize帮助器在模型中修复它: require ‘action_view’ class NotesController %w(a object p param h1 h2 h3 h4 h5 h6 br hr ul li img), :attributes => %w(href name src type value width height data) ); @note.update_attributes(params[:note]) 这在控制器中感觉很乱。 有没有更好的办法? 即以某种方式集成这个ActiveRecord所以我可以很容易地指定这个和其他字段这样做,然后以类似的方式保存validation? 谢谢你的任何建议。 编辑: 在这里取得一些进展。 在我的/ Libs下我有 module SanitizeUtilities def sanitize_tiny_mce(field) ActionController::Base.helpers.sanitize(field, :tags => %w(abi strong em p param h1 […]

Rails 3:Relation.count和Relation.all.count之间的区别

莫因, 我偶然发现了ActiveRecord的不一致。 我试图在大表的两列中获取所有使用的值组合。 第一个想法: SELECT DISTINCT col1, col2 FROM table 想象一下一个rails应用程序,它将餐食组织成一个模型,每个餐点都有多种has_many :noodles每个面条都有属性(因此DB表格列)的color和shape 。 我的目标是获得一餐的所有现有color和shape组合的数量。 由于AR不提供我使用的“独特”方法 my_meal.noodles.select(“distinct color, shape”) 得到(在rails控制台stdout中)一个6行输出的8个Noodle对象(分别是它们的String表示)。 但: >> my_meal.noodles.select(“distinct color, shape”).count => 1606 事实上, my_meal包含1606面条。 如果我将Relation转换为数组并获取它的大小或使用.all.count ,结果是正确的。 所以我的问题是,为什么AR输出8个对象但是计算所有数据库线? 这里似乎提到了类似的问题,但没有给出答案。 蒂姆,谢谢和最诚挚的问候

将复杂的has_many关系移植到Rails> 4.1(没有finder_sql)

我正在将Rails应用程序移植到Rails 4.2。 这个Rails应用程序在关联中包含一些相当复杂的手动SQL代码 – 部分原因是DB优化(例如子选择而不是JOIN),部分原因是由于在编写时没有可行的替代方案(Rails 3.0),部分原因是由于缺乏知识(我希望,至少 – 这很容易解决)。 示例:InternalMessage类。 可以在用户之间发送消息(InternalMessage的收件人和消息的“删除”,存储在InternalMessagesRecipients中,因为可以有几个),并且可以读取,回复,转发和删除它们。 该关联看起来像这样: class User “SELECT DISTINCT(internal_messages.id), internal_messages.* FROM internal_messages ” + ‘ LEFT JOIN internal_messages_recipients ON internal_messages.id=internal_messages_recipients.internal_message_id’ + ‘ WHERE internal_messages.sender_id = #{id} OR internal_messages_recipients.recipient_id = #{id}’, :counter_sql => ‘SELECT count(DISTINCT(internal_messages.id)) FROM internal_messages ‘ + ‘ LEFT JOIN internal_messages_recipients ON internal_messages.id=internal_messages_recipients.internal_message_id’ + ‘ WHERE internal_messages.sender_id = […]

Heroku“psql:FATAL:剩余的连接插槽保留用于非复制超级用户连接”

我收到运行Heroku Postgres Basic的上述错误消息( 根据此问题 ),并一直在尝试诊断问题。 其中一个建议是使用连接池,但似乎Rails内置了它 。 另一个建议是应用程序配置不正确并打开太多连接。 我的应用程序通过Active Record管理它的所有连接,我从Navicat直接连接到数据库(或者至少我以为我有)。 我该如何调试? 解析度 事实certificate这是一个Heroku问题。 来自Heroku支持: 我们在运行Basic数据库的服务器上检测到了一个问题。 虽然我们查明并解决了这个问题,但我们建议您配置一个新的Basic数据库并使用PGBackups进行迁移,详情请参见https://devcenter.heroku.com/articles/upgrade-heroku-postgres-with-pgbackups 。 这应该将您的数据库放在新服务器上。 我为这次中断道歉 – 我们正在努力解决这个问题并防止它在未来发生。

STI和多晶型物

我的代码有问题 class Post < ActiveRecord::Base end class NewsArticle :commentable, :dependent => :destroy, :order => ‘created_at’ end class Comment true, :counter_cache => true end 并尝试去获取一些NewsArticle的评论,我在日志中看到类似的东西 Comment Load (0.9ms) SELECT “comments”.* FROM “comments” WHERE (“comments”.”commentable_id” = 1 and “comments”.”commentable_type” = ‘Post’) ORDER BY created_at 奇怪的是“commentable_type”=“发布” 。 怎么了? PS:Rails 2.3.5 && ruby​​ 1.8.7(2010-01-10 patchlevel 249)[i686-darwin10]

`form_for`绕过了模型访问器。 如何让它停止? (或者:如何制作自定义属性序列化器?)

我将这些方法设置为自动加密值。 class User < ApplicationRecord def name=(val) super val.encrypt end def name (super() || '').decrypt end 当我尝试提交表单并且出现错误(缺少电话)时, name属性显示为乱码。 它在validation成功时起作用。 当我逐行通过我的控制器#update时,它也可以在控制台中工作。 irb(main):015:0> u = User.find 1 irb(main):016:0> u.name => “Sue D. Nym” irb(main):017:0> u.phone => “212-555-1234″ irb(main):018:0> u.update name: ‘Sue D. Nym’, phone: ” (10.0ms) BEGIN (1.0ms) ROLLBACK => false irb(main):020:0> u.save => false irb(main):029:0> u.errors.full_messages.join […]

Rails两个模型之间的多个关联

我在Rails 3应用程序中有Flight,Person和Glider模型。 我已经定义了自定义关系,因为我需要多个外键引用来自flight表的Person。 协会只能单向工作。 class Flight “Person” belongs_to :instructor, :class_name => “Person” belongs_to :towplane_pilot, :class_name => “Person” belongs_to :airplane_instructor, :class_name => “Person” belongs_to :glider belongs_to :rep_glider, :class_name => “Glider” belongs_to :departure_airfield, :class_name => “Airfield” belongs_to :arrival_airfield, :class_name => “Airfield” end class Glider “rep_glider_id”, :class_name => “Flight” end class Person “pilot_id”, :class_name => “Flight” has_many :instructed_flights, […]

将ActiveRecord对象与Rspec进行比较

在Rspec中有一个很好的方法来比较两个ActiveRecord对象而忽略id,&c? 例如,假设我正在从XML解析一个对象并从夹具中加载另一个对象,而我正在测试的是我的XML解析器正常工作。 我目前拥有的是自定义匹配器 actual.attributes.reject{|key,v| %w”id updated_at created_at”.include? key } == expected.attributes.reject{|key,v| %w”id updated_at created_at”.include? key } 但我想知道是否有更好的方法。 然后稍微复杂一点,但有没有办法在一组上做类似的事情? 假设说XML解析器还创建了几个属于原始对象的对象。 所以我最终得到的集应该是相同的,除了id,created_at和c,我想知道是否有一种很好的方法来测试,除了循环,清除这些变量和检查。

如何使用Ruby on Rails中的映射表跟踪模型历史记录?

梦想 我想记录用户何时更改其地址。 这样,当下订单时,它将始终能够引用订单放置时使用的用户地址。 可能的架构 users ( id username email … ) user_addresses ( id label line_1 line_2 city state zip … ) user_addresses_map ( user_id user_address_id start_time end_time ) orders ( id user_id user_address_id order_status_id … created_at updated_at ) 在sql中,这可能类似于:[sql] select ua.* from orders o join users u on u.id = o.user_id join user_addressses_map uam […]

Rails 2.3会话

我正在开发rails 2.3.2 app。 我需要为订单记录保留session_id,检索它,最后在订单完成时删除session_id。 它在我使用cookie作为会话存储时起作用,但它不适用于active_record存储。 (我重新启动了浏览器,因此没有缓存问题。) 我知道rails 2.3实现了延迟会话加载。 我读了一些关于它的信息,但我仍然感到困惑。 有人可以澄清我如何在这种情况下使用session_id吗? 我在做什么…… 用户通过多个页面进行订单。 没有注册,也没有登录。 所以我将session_id保留在订单记录中,以便其他用户无法访问订单。 @order = Order.last:conditions => {:id => params [:id],:session_id => session [:session_id]} 订单完成后,我将nil设置为session_id列。 您将如何在惰性会话(和active_record存储)环境中实现这种情况? 谢谢。 山姆