Tag: activerecord

Rails 3 ActiveRecord方法链接,引擎盖下

假设您构建了一个涉及多个方法链接的查询,例如 Post.where(‘id > 10’).limit(20).order(‘id asc’).except(:order) 我想知道幕后发生了什么? 据推测,链的每个部分都有助于构建一个SQL SELECT,一旦链完成,就会执行语句,创建模型等。它如何“知道”链的末端在哪里? 每个方法都返回一个创建SQL片段的ActiveRecord :: Relation吗?

通过关联的新模型对象

我认为可以通过关联创建一个新的模型对象。 class Order < ActiveRecord::Base belongs_to :basket end class Basket < ActiveRecord::Base has_one :order end order = Order.new() basket = order.basket.new() # NoMethodError: undefined method `new' for nil:NilClass

在memcached中存储ActiveRecord对象的最佳方法是什么?

目前在memcached中存储ActiveRecord对象存在两个问题。 未定义的类/模块问题( Google搜索 )。 从我读过的内容来看,这仍然是一个没有人有真正好的解决方案的错误。 cache_fu插件可能是最好的解决方案,将其检索调用包装在试图捕获此错误的块中,解析消息并尝试加载未定义的类/模块。 臭名昭着的LH票#1339( LH票 )。 只有在cache_classes设置为FALSE(开发,测试)时才会发生此错误。 谷歌搜索几周后,我仍然没有找到一个很好的技术来存储AR实例在memcached中,而不必处理上面列出的2个问题。 我还没有尝试过的想法是从实例中删除属性作为字符串(只是AR在进行类型转换之前如何从DB接收它们),将它们存储在memcached中然后从缓存中检索,以某种方式实例化AR使用这些值的对象。 这可能吗? 如果是这样,最好的方法是什么? 我只是在寻找其他Rails开发人员解决这个问题的方法。

ruby-on-rails检查查询结果是否为空(Model.find)

我在rails上使用ruby并尝试检查查询是否返回值。 这是查询: @search = Customer.find_by_name($login_name) 如果查询找到结果,一切都很好,但我怎么能对空结果做出反应呢? 我试过了: if @search.empty? flash[:notice] = ‘Username nicht bekannt’ redirect_to :action => :login end 但我得到一个错误: undefined method `empty?’ for nil:NilClass 任何想法出了什么问题? 谢谢!!!

Rails has_many:通过条件和建立关联

我在构建一个has_many :through的关联时遇到了问题has_many :through条件。 我有这个型号: class Contact :group_contacts, :conditions => {:groups => {:published => true}} end 当我尝试从联系人实例化一个组时,会出现问题。 使用上面的语法,我收到一个错误: contact.groups.build => ActiveRecord::UnknownAttributeError: unknown attribute: groups 但是,当我使用以下语法时,它可以工作: has_many :groups, :through => :group_contacts, :conditions => [‘groups.published = ?’, true] contact.groups.build => # 我在这个问题中看到了对确切问题的引用。 据说将为此错误提交一张票(返回前3版本)。 我在rails 3.0.x上找不到任何东西。 我正在使用3.0.8。 有没有人发现这个问题? 进一步说明 : 我还发现,当我建立群组时,它实际上忽略了我在建立时的关联条件。 上面构建published => true的唯一原因是因为它是db中的默认值。 这似乎是一种回归,任何人都可以validation这一点吗?

在Rails has_many中保存关联记录的顺序:通过关联

我正在开发一个Rails插件,其中包含一种修改has_many:关联中相关记录顺序的方法。 假设我们有以下型号: class Playlist :destroy has_many :songs, :through => :playlists_songs end class Song :destroy has_many :playlists, :through => :playlists_songs end class PlaylistsSong < ActiveRecord::Base belongs_to :playlist belongs_to :song end 如果我们改变播放列表歌曲的顺序(例如@playlist.songs.rotate! ),Rails不会触及playlists_songs表中的记录(我正在使用Rails 3.1),这是有道理的。 我想调用播放列表的歌曲=方法保存歌曲的顺序,但是,可以通过删除播放列表中的相关现有行并以正确的顺序创建新的行(以便:order => “id”可以在检索它们时使用)或者通过向playlists_songs添加sort:integer列并相应地更新这些值。 我没有看到任何允许这样做的回调(例如before_add)。 在ActiveRecord :: Associations :: CollectionAssociation中 ,相关的方法似乎是writer , replace和replace_records ,但我对最好的下一步将会失败。 有没有办法扩展或安全地覆盖这些方法之一,以允许我正在寻找的function(最好只针对特定的关联),或者是否有一个不同的,更好的方法呢?

Rails – 包括与动态条件的关联

考虑到学校模式和学生模型,学校与学生有很多关系: has_many :students, :conditions => proc { “year_id=#{send(:active_year_id)}” } 其中active_year_id是学校模型中定义的方法,我在调用时遇到“active_year_id未定义”的错误: School.where(:active => true).includes(:students) 当我这样做时,情况正常 School.where(:id => 10).students 只有当我尝试使用包含时才会出现错误。 这是正确的行为吗? 如果没有,我做错了什么,我该如何解决? 使用Rails 3.0.9,REE 1.8.7。

rails 4中的“find_all_by_id”等价物

我有一组id,我想使用活动记录查询从数据库中找到它们各自的记录。 例如: ids = [2, 3, 1] 现在,让我找到一个特定模型的所有记录,其id是数组中的一个,在较低版本的rails中,我想我可以做类似的事情: Model.find_all_by_id([2, 3, 1]) 但根据这篇文章 , These methods were deprecated on 4.0 and removed at 4.1. If you want to keep sing then you need to include this gem https://github.com/rails/activerecord-deprecated_finders 我的问题是,我无法在rails4.2中执行此操作而无需包含gem? 谢谢。

rails find:使用条件,同时通过不同的命名关联包括相同的表

我有用户发送给其他用户的post。 有两种模式 – :post和:user,以及:post具有以下命名关联: belongs_to :from_user, :class_name => “User”, :foreign_key => “from_user_id” belongs_to :to_user, :class_name => “User”, :foreign_key => “to_user_id” both:user和:post都有“is_public”列,表示单个post和/或整个用户配置文件可以是公共的或私有的。 我的目标是获取公开的post列表,其收件人具有公开个人资料。 同时,我想“包含”发件人和收件人信息以最小化db调用次数。 挑战在于我通过命名关联有效地“包括”了同一个表两次,但在我的“条件”中,我需要确保我只过滤收件人的“is_public”列。 我无法执行以下操作,因为“条件”不接受关联名称作为参数: Post.find(:all, :include => [ :to_user, :from_user ], :conditions => { :is_public => true, :to_user => { :is_public => true }}) 因此,我可以通过在“users”表上执行额外的“join”来实现此目的: Post.find(:all, :include => [ :to_user, :from_user ], :joins => […]

如何使用activerecord的查询界面和范围来识别比赛中的最爱

我有两个模型Starter和Race。 Starter belongs_to :race Race has_many :starters Starter和race的属性如下: Starter attributes: id, race_id, finish_position, odds Race: id, race_date, race_number, field_size 我正在努力完成两件事: 选择每场比赛中的最爱 。 #对于特定比赛,赔率最低的初学者 * 选择任何打败的collections夹 *#一个有finish_position> 1 *的collections夹 确定collections和打败collections的逻辑非常简单(见上文),但我很难将逻辑转换为activerecord,这也是一个例子,可以使用activerecord范围。 这是我最喜欢的尝试: Starter.joins(:race).where(:finish_position => minimum(finish_position)) 这不起作用,但我仍在努力。 我想理想的是拥有一个最喜欢的范围和一个打败的范围。