Tag: activerecord

Ruby on Rails中的存储过程

我是一个有6年经验的.net人。 最近我开始研究ROR项目,并意识到存储过程/ sql函数根本没有被使用。 在询问它时我知道这是常见的做法,一般来说团队中没有人写一个SQL查询,一切都是使用ActiveRecord完成的。 我搜索了任何可能的原因,但没有找到太多信息。 所以我只是好奇才知道 通常的做法是不首选使用存储过程/ sql函数吗? 使用存储过程有哪些优缺点?

Rails:自定义validation消息

我正在尝试制作一个简单的自定义validation消息。 我正在使用的validation编译并运行正常,但我没有看到消息有任何变化: validates :rating, :inclusion => { :in => 0..5 }, :presence => { :message => ” must be within 0-5″ } 我收到的消息仍然是Rating is not included in the list 我需要validationrating是否存在,并且是0-5之间的decimal

ActiveRecord:inverse_of不适用于has_many:通过on上的连接模型

我无法在创建时使用inverse_of来处理连接模型。 我不确定这是一个错误还是没有实现。 我有以下型号: class Challenge :group_challenges has_many :group_challenges, :inverse_of => :challenge attr_accessor :contact_ids end class GroupChallenge :group_challenges belongs_to :group, :inverse_of => :group_challenges before_save :check_challenge def check_challenge Rails.logger.debug(“challenge.contact_ids: #{challenge.contact_ids}”) end end class Group :group_challenges has_many :group_challenges, :inverse_of => :group end contact_ids是我的challenge的虚拟属性,我想在创建该关联时在group_challenges模型中访问这些属性。 我无法让它发挥作用。 这是一个例子: challenge = Challenge.new :groups => Group.all, :contact_ids => [1,2,3] # log output => […]

回调更改的ActiveRecord属性?

我知道ActiveRecord :: Dirty和相关的方法,但我没有看到我可以订阅属性更改事件的方法。 就像是: class Person < ActiveRecord::Base def attribute_changed(attribute_name, old_value, new_value) end #or attribute_changed do |attribute_name, old_value, new_value| end end 是否有Rails标准或插件? 我觉得它必定存在于某个地方,我只是想念它。

将ActiveRecord habtm查询转换为Arel

我有一个非常普遍的关系: Photo has_and_belongs_to_many :tags Tag has_and_belongs_to_many :photos 在我的Photo模型中,我有一个“带标签”的方法,我用它来查找用一组给定的tag_ids标记的照片。 此查询只需匹配包含所有给定标记的照片,但无需考虑是否存在任何其他标记。 这是我的方法: def self.with_terms( array ) select(‘distinct photos.*’).joins(:tags).where(‘tags.id’ => array).group(“photos.” + self.column_names.join(‘, photos.’)).having(“count(*) = #{array.size}”) end 这按预期工作。 现在,为了更好地与我正在使用的其他库集成,我需要在Arel中重写它。 (让它成为Arel节点?,不确定你通常称之为什么)。 我一直在尝试这个,但说实话我以前从未尝试过使用过Arel,所以我有点失落。 我一直在试验控制台并尝试: t = Photo.arel_table q = t.join(:tags).on(t[:tags_id].in(array)) Photo.where(q) 但是,(1)我认为q首先不是正确的查询,并且(2)它创建了一个Arel::SelectManager ,当它传递到where调用引发时Cannot visit Arel::SelectManager 。 所以,显然我做错了。 更新:为了在这里特别具体,我希望返回一个Arel节点,因为我正在使用一个gem(ransack),希望你传递它的搜索方法的Arel节点。 Ransack将此Arel节点与其他节点链接在一起生成复杂的搜索查询。 Arel大师可以告诉我这是怎么做的吗?

Ruby on Rails:有没有办法从数据库中提取项目并按指定顺序返回它们?

我有一个项目ID, item_ids 。 我将此数组传递给ActiveRecord查询以从数据库中检索相应的项: Item.where(:id => item_ids) 有没有办法以与通过item_ids数组传入的顺序相同的顺序返回项目? 如果它有所不同,我在Ruby on Rails 3.0.12上使用PostgreSQL作为我的数据库。

Rails多态has_many:通过

我从外部API中提取一些数据,并希望在本地缓存结果。 我有一个class SearchTerm ,我希望通过表searchable_items与几个不同的ActiveRecord类型相关联。 我很确定我的表格设置正确,但我的关联中的某些内容一定是错的。 class Foo :searchable, :through => :searchable_items end class Bar :searchable, :through => :searchable_items end class SearchTerm :searchable_items end class SearchableItem true end 我希望能够做一些像SearchTerm.find_by_term(‘SearchTerm’).searchables (它将返回一个Foo和Bar对象的数组)然而,我得到错误Could not find the association :searchable_items in model SearchTerm 提前感谢您提供给我的任何见解!

具有别名表名的ActiveRecord查询

使用包含范围的模型关注点,知道嵌套和/或自引用查询的最佳方法是什么? 在我的一个问题中,我的范围与以下类似: scope :current, ->(as_at = Time.now) { current_and_expired(as_at).current_and_future(as_at) } scope :current_and_future, ->(as_at = Time.now) { where(“#{upper_bound_column} IS NULL OR #{upper_bound_column} >= ?”, as_at) } scope :current_and_expired, ->(as_at = Time.now) { where(“#{lower_bound_column} IS NULL OR #{lower_bound_column} <= ?", as_at) } def self.lower_bound_column lower_bound_field end def self.upper_bound_column upper_bound_field end 并通过has_many来引用,例如: has_many :company_users, -> { current } […]

在导轨和多态关系中使用UUID作为主键

我正在创建一个将分散的rails 3应用程序,我需要使用UUID作为我的表的主键 ,什么是最好的gem,插件为Job。 我还想知道是否有可能在不使用polymorphicable_type列的情况下使用ActiveRecord多态关系,因为我使用的是UUID。 我创建了一个使用UUID作为键的http://github.com/boriscy/uuidrails3 演示 ,你应该检查lib /中的模块UUIDHelper以及所有的迁移。 无需在数据库中添加主键,只需添加索引,因为主键validation字段的唯一性,但我们不需要使用UUID。

在范围中使用OR与查询

在Rails3中,我有: Class Teacher # active :boolean has_and_belongs_to_many :subjects Class Subject # active :boolean has_and_belongs_to_many :teachers 我正在尝试构建一个教师范围,该范围返回所有active或与active Subject相关联的Teachers 。 这些范围单独工作,但如何将它们作为单个范围与OR组合? scope :active_teachers, where(active: true) scope :more_active_teachers, joins(:subjects).where(:subjects => {active: true}) 我试过这个没有成功: scope :active_teachers, where(active: true).or(joins(:subjects) .where(:subjects => {active: true})) 更新: 我以为我有一个解决方案,但这不再是懒惰的负载,两次打到数据库 – 最重要的是 – 返回一个数组而不是一个AR对象! scope :active_teachers, where(active: true) | joins(:subjects).where(:subjects => {active: true})