Tag: activerecord

如何为每个表在Rails中创建完整的审核日志?

我们最近开始在我们公司进行合规性推动,并且需要保留我们目前在Rails应用程序中管理的数据的完整历史记录。 我们已经可以将每个操作的描述性内容简单地推送到日志文件中,这是一种相当不引人注目的方式。 我倾向于在ApplicationController做这样的事情: around_filter :set_logger_username def set_logger_username Thread.current[“username”] = current_user.login || “guest” yield Thread.current[“username”] = nil end 然后创建一个看起来像这样的观察者: class AuditObserver < ActiveRecord::Observer observe … #all models that need to be observed def after_create(auditable) AUDIT_LOG.info "[#{username}][ADD][#{auditable.class.name}][#{auditable.id}]:#{auditable.inspect}" end def before_update(auditable) AUDIT_LOG.info "[#{username}][MOD][#{auditable.class.name}][#{auditable.id}]:#{auditable.changed.inspect}" end def before_destroy(auditable) AUDIT_LOG.info "[#{username}][DEL][#{auditable.class.name}][#{auditable.id}]:#{auditable.inspect}" end def username (Thread.current['username'] || "UNKNOWN").ljust(30) end end 并且通常这很好用 ,但是当使用添加到has_many:through […]

删除孤儿父母

我有这样的关系: Parent has_many :children Child belongs_to :parent 我想要做的是删除父母,如果没有更多的孩子。 所以要做到这一点,我有: Child before_destroy :destroy_orphaned_parent def destroy_orphaned_parent parent.children.each do |c| return if c != self end parent.destroy end 这工作正常,但我也想将父级的删除级联到子级。 我通常会这样做: Parent has_many :children, :dependent => :destroy 这会导致WebRick服务器在测试时崩溃。 我假设这是由于最后一个孩子的无限循环删除父母删除孩子等。 我开始认为有更好的方法来做到这一点? 有人有主意吗? 有没有办法防止这种递归?

返回自定义查询在activerecord中选择

我有一个查询,它做了一些数学运算,并返回一个带有结果集的计算自定义选择字段。 我无法弄清楚如何在返回的activerecord对象中访问它。 我也为它添加了一个attr_accessor。 attr_accessor :percentage_used select(‘gateways.*, (num_transactions_today/ SUM(num_transactions_today)) AS percentage_used ‘).joins(:gateway_groups).where(‘map_gateway_groups.gateway_group_id = ?’, gateway_group_id) 在结果集中,我希望能够访问:percentage_used,但它不在那里。 关于我做错什么的任何想法? 我以前从未需要这样做。 谢谢

ActiveRecord :: Relation对象如何调用类方法

ActiveRecord :: Relation对象如何调用类方法? class Project < ActiveRecord::Base has_many :tasks end class Task < ActiveRecord::Base belongs_to :project def self.initial_tasks # class methods # here return initial tasks end end 现在我们可以打电话: Project.first.tasks.initial_tasks # how it works initial_tasks是一个类方法,我们不能在对象上调用类方法。 Project.first.tasks返回一个ActiveRecord :: Relation对象,那么它怎么能调用initial_tasks呢? 请解释。

在数据库中清晰地表示电子商务产品和变体

我有一个我正在建设的电子商务商店。 我正在使用Rails / ActiveRecord,但实际上没有必要回答这个问题(但是,如果您熟悉这些内容,请随时回答Rails / AR)。 商店的要求之一是它需要代表两种类型的产品: 简单的产品 – 这些产品只有一个选项,例如乐队的CD。 它有基本的价格和数量。 有变化的产品 – 这些产品有多种选择,例如有3种尺寸和3种颜色的T恤。 尺寸和颜色的每种组合都有自己的价格和数量。 我过去做过这种事情,做了以下事情: 有产品表,其中包含产品的主要信息(标题等)。 有一个变量表,其中包含每种变体的价格和数量信息。 产品 has_many 变种 。 对于简单的产品 ,它们只有一个关联的Variant 。 有没有更好的方法可以做到这一点?

在ruby / ActiveRecord中生成类似Instagram或Youtube的不可语句字符串ID

在创建给定的ActiveRecord模型对象的实例时,我需要生成一个短的(6-8个字符)唯一字符串,用作URL中的标识符,采用Instagram的照片URL样式(如http://instagram.com/ p / P541i4ErdL / ,我刚刚加入404)或Youtube的videourl(如http://www.youtube.com/watch?v=oHg5SJYRHA0 )。 这样做的最佳方法是什么? 最简单的方法就是重复创建一个随机字符串 ,直到它是唯一的? 有没有办法散列/随机播放整数id,以便用户不能通过更改一个字符来破解URL(就像我上面的404’d Instagram链接那样)并最终获得新记录?

如何迭代ActiveRecord属性,包括attr_accessor方法

我到处寻找一个优雅的解决方案。 基本问题似乎是,在ActiveRecord :: Base中,映射到数据库列的ActiveRecord属性与attr_accessor方法完全不同。 我想做的事情如下: model.attribute_names.each do |name| # do stuff end 以包含attr_accessor字段的方式,但不包括任何其他实例方法。 我知道这不是内置的,但最优雅的方法是什么?

将Rails中的主键更改为字符串

所以我有两个模型,State和Acquisition。 State has_many收购。 我觉得51个记录的自动增量整数主键是相当愚蠢的。 所以我将State的模型改为PK(State是两个字母的缩写;我没有在任何地方存储实际的州名: class State < ActiveRecord::Base self.primary_key = "state" has_many :acquisition_histories end 问题是当我创建我的Acquisition模型时,它创建了外键列state_id作为整数。 更具体地说,脚本/生成的迁移确实: class CreateAcquisitions < ActiveRecord::Migration def self.up create_table :acquisitions do |t| t.date :date t.string :category t.text :notes t.references :state t.timestamps end end end 我假设t.references数据类型将其设置为int。 问题是我的Acquisition类上的create方法试图将状态缩写放入表获取的state_id字段中(是的,它在数据库上称为state_id,即使它表示:迁移脚本中的状态)。 该方法不会失败,但它确实在state_id字段中放置了一个0并且记录进入以太。

如何自定义rails activerecordvalidation错误消息以显示属性值

当用户尝试使用已存在的名称创建记录时,我想显示如下错误消息: name “some name” has already been taken 我一直在努力做到: validates_uniqueness_of :name, :message => “#{name} has already been taken” 但是这会输出表名而不是name属性的值

Rails 3.1限制用户创建的对象

我想限制用户可以创建的模型对象的数量。 我已经尝试过以下但是没有用。 我理解rails 3.1中发生了一些变化,现在还不确定如何实现。 class User 5, :dependent => :destroy # This doesn’t work end class Things <ActiveRecord::Base belongs_to :user end