Tag: activerecord

memcache在使用acts_as_cached插件时获取错误的值

我已经安装了memcached gem和acts_as_cached插件。 我的模特很少 class Bike <ActiveRecord :: Base acts_as_cached ………. 结束 class Car <ActiveRecord :: Base acts_as_cached ………. 结束 像这样我有更多的模特 自行车。 get_cache (“key”){Bike.find(…)} 汽车。 get_cache (“key”){Car.find(…)} 即使我维护不同的键,它取出错误的对象而不是必需的对象。

如何防止ActiveRecord写入数据库?

我有一个特殊的用例,我想创建一个接受块的方法,这样在该块内发生的任何事情都不会写入数据库。 显而易见的答案是使用这样的交易: def no_db ActiveRecord::Base.transaction do yield raise ActiveRecord::Rollback end end 但麻烦的是,如果我的no_db方法在另一个事务块中使用,那么我将在嵌套事务的情况下使用。 这里的缺点是嵌套事务只有MySQL支持,我需要支持PG,但更重要的是SQLite(用于测试)。 (我知道PG是通过保存点支持的,性能有多可靠?)。 这种方法的另一个问题是它看起来效率非常低,将数据写入数据库,然后将它们回滚。 如果我可以做这样的事情会更好: def no_db_2 # ActiveRecord::Base.turn_off_database yield # ActiveRecord::Base.turn_on_database end 有这样的方法吗? 或者类似于我正在寻找的方法? 我认为它需要相当低的水平.. (Rails版本是3.0.5,但如果有一个优雅的Rails 3.1解决方案,我会很高兴)

用于将ActiveRecordvalidation错误转换为API响应的模式

我有一个Rails 2.x应用程序,我正在构建一个RESTful接口。 出于一些(好的)原因,我选择使用与MySQL中的基础字段不同的名称通过API公开我的ActiveRecord模型上的一些字段。 例如,我的很多MySQL字段都以模型名称为前缀(user_type,user_first_name等)。 我的请求/响应使用没有前缀的名称(type,first_name)。 动作方法看起来像(是的,这已经是维护的痛苦之源) def create u = User.new u.user_type = params[:type] u.user_first_name = params[:first_name] u.save! end 救援ActiveRecord :: RecordInvalid时出现问题。 我将记录中的错误集合转换为客户端应用程序可以理解的密钥。 例如: validation_error.blank.user_first_name 通过: rescue_from ValidationError, ActiveRecord::RecordInvalid do |e| errors = [] e.record.errors.each_error do |attr, error| errors < “validation_error.#{error.type.to_s}.#{attr}”} end errors.uniq! respond_to do |format| format.xml { render_xml_error errors, :unprocessable_entity} end end 问题是“user_first_name”不是客户端代码知道的任何字段 – […]

Rails4 has_many通过参数

我有一个has_many through协会如下: has_many :bookmarks, -> {where(‘actions.bookmark=true’)}, :through => :actions, :source => :object 我想要做的是扩展上面的内容以传递被加标签的对象的类别。 类似于以下内容: has_many :bookmarks, -> (category) {where(‘actions.bookmark=true and objects.category=?’, category)}, :through => :actions, :source => :object 我希望它能让我进行诸如user.bookmarks(“papers”) 。 但是,当我尝试以上操作时, category采用# (基本上是上面调用中的user ),我似乎无法用简单的字符串调用关联。 有关如何实现这一目标的任何建议? 非常感谢。

rails has_many setter应该设置条件,如果指定的话

这对我来说似乎是Rails中的一个错误,但我可能做的不多。 那么我怎样才能达到预期的行为呢? 假设我们有: class User “Friend”, :conditions => {:awesome => true} end 并执行代码: >> my_user.awesome_friends <‘jim’) 之后,当我检查这个朋友对象时,我看到填充了user_id字段。 但我也希望看到“真棒”这个“真棒”列,但事实并非如此。 此外,如果我从控制台执行以下操作: >> my_user.awesome_friends <‘jim’) >> my_user.awesome_friends = [#] # Quit and restart the console >> my_user.awesome_friends = [] 有什么想法吗? 我认为条件哈希可能是任意复杂的,使得集成到setter中是不可能的。 但在某种程度上,我们感觉默认情况下我们传递的条件是“:user_id => self.id”,并且设置已经设置,其他人不应该这样做吗? 谢谢,迈克 编辑: 我发现has_many有回调,所以我想我可能会定义这样的关系: has_many :awesome_friends, :class_name => “Friend”, :conditions => {:awesome => true}, :before_add […]

如何在Rails中管理3个多对多模型

我正在遵循Railscast建议制作一个不同的模型来维护many-to-many关系。 但是,我无法提取传递关系数据。 想象一下,有3个模型具有多对多: User Color Shades 我又制作了两个型号: ColorLiking (maintains User Color), DiffShades (maintains Color Shades) 问题现在,如果一切设置正确…如何找到属于User的Shades ? 我将如何建立这种关系? class User :diffShades, :source => :color end 上面似乎不起作用…… 使用SQL,以下查询将起作用: select * from shades where id in (select shade_id from diffshades where color_id in (select color_id from colorlikings where user_id = ?))

使用选择调用的双嵌套连接的Rails活动记录查询

我有以下架构: 照片has many组has many用户。 我使用这个Rails服务器作为iOS应用程序的后端,并且在添加照片时不断需要向组的所有相关用户推送通知。 我的问题是找到最便宜的查询来解决仅受影响的User.ids 。 到目前为止我有 Photo.find(1).groups.joins(:users) 我知道在此之后我必须输入一个select参数,但是无法弄清楚我生活的语法。 鉴于照片,我正在寻找最有效的方法来查找受影响的用户ID的集合。 任何帮助将非常感激!!!

Rails bug:accepts_nested_attributes_for没有更新我的has_many关联

我有2个型号: class Book < ActiveRecord::Base has_many :book_versions accepts_nested_attributes_for :book_versions, allow_destroy: true validates_associated :book_versions class BookVersion < ActiveRecord::Base has_many :collection_items has_many :collections, through: :collection_items belongs_to :book validates_presence_of :price, :isbn #<– validates presence 这是我的参数。 请注意我如何将book_version的price保留为名称bb空。 这应该是在BookVersion模型中触发validates_presence_of :pricevalidation(但它没有): “book”=> {“title”=>“zzzzzz”,“subtitle”=>“”,“author_ids”=> [“”],“illustrator_ids”=> [“”],“award_ids”=> [“ “],”theme_ids“=> [”“],”publication_date“=>”“,”imprint_id“=>”1“,”language_ids“=> [”“],”eng_vers_id“=>”“,”book_versions_attributes “=> {”0“=> {”book_id“=>”2848“,”name“=>”alt“,”isbn“=>”“,”price“=>”“,”famis_number“=>” “,”famis_price“=>”“,”weight_in_pounds“=>”“},”1“=> {”book_id“=>”2848“,”name“=>”bb“,”isbn“=>”123123123123 “,”“price”=>“”,“famis_number”=>“”,“famis_price”=>“”,“weight_in_pounds”=>“1.0”,“库存”=>“08”,“id”=>“ 1030″ }, 当我在我的控制器中执行@book.update_attributes(params[:book])时,即使一切看起来都有效,也没有book_versions更新: >> @book.update_attributes(params[:book]) => […]

rails3 – 这是更好的性能代码

哪个是最好的做法,并给我更好的表现? 例如: 我有状态表,有5条记录,每条记录需要存储在单独的变量上。 方法一: @new_status = Status.find_by_status(“NEW”) @inprocess_status = Status.find_by_status(“InProcess”) @completed_status = Status.find_by_status(“Completed”) @occupied_status = Status.find_by_status(“Occupied”) @success_status = Status.find_by_status(“Success”) 方法2: statuses = Status.all @new_status = statuses.find {|status| status.status == “NEW”} @inprocess_status = statuses.find {|status| status.status == “InProcess”} @completed_status = statuses.find {|status| status.status == “Completed”} @occupied_status = statuses.find {|status| status.status == “Occupied”} @success_status = statuses.find {|status| […]

设计现有数据库:401使用有效密码未授权

我正在尝试使用设计用于我的网站的用户身份validation。 它使用现有的User表。 该表具有用户名和密码,但是当我尝试登录时,出现以下错误: 在90ms内完成401 Unauthorized。 日志: Started POST “/users/sign_in” for 127.0.0.1 at 2013-06-06 15:50:01 +0530 Processing by Devise::SessionsController#create as HTML Parameters: {“utf8″=>”✓”, “authenticity_token”=>”+uKE28LrkWW71EHeasDSDCENQogAGODfBc3ZJJLyi9U=”, “user”=>{“email”=>”admin@abc.com”, “password”=>”[FILTERED]”, “remember_me”=>”0”}, “commit”=>”Sign in”} User Load (0.1ms) SELECT `users`.* FROM `users` WHERE `users`.`email` = ‘admin@abc.com’ LIMIT 1 Completed 401 Unauthorized in 90ms Processing by Devise::SessionsController#new as HTML Parameters: {“utf8″=>”✓”, “authenticity_token”=>”+uKE28LrkWW71EHeasDSDCENQogAGODfBc3ZJJLyi9U=”, “user”=>{“email”=>”admin@abc.com”, […]