Tag: activerecord

Rails 3 ActiveRecord渴望加载范围

请帮帮我。 我有一些与其他模型有关联的模型。 例如:profile => has_many:statistics在统计模型中我有一些范围: scope last_ten, limit(10).order(‘online desc’) 问题是如何在此范围内使用预先加载? 我不需要每个配置文件的统计记录。 只有范围。 现在我只能使用 User.profiles.includes(:statistics) 谢谢。

为什么ActiveRecord回调要求实例变量或实例方法以self关键字为前缀?

ActiveRecord有一些不同的回调方法用于简化模型逻辑。 例如after_find和before_create方法。 考虑以下代码示例: class ExternalPrintingCard < ActiveRecord::Base belongs_to :user belongs_to :ph_user after_create :change_pin def change_pin self.user.randomize_printer_pin end def after_find return if self.card_status == false self.card_status = false if self.is_used_up? self.card_status = false if self.is_expired? self.save! end end 如果我从实例变量或实例方法中删除所有自带前缀,则会调用这两个回调,但就好像它们是这些回调方法中的局部变量一样。 这个实例变量( card_status ),实例方法( save! , is_used_up?和is_expired? )和关联( user )在这两个没有self前缀的回调方法之外工作正常。 Rails文档中用于回调方法(实例方法)的示例代码似乎总是使用self前缀,即使它正在调用实例变量或方法,正确地说它们可以在没有self前缀的情况下访问。 我希望有更好理解ActiveRecord回调的人可以帮助揭示这种行为。 干杯

如何使用Rails中的值初始化ActiveRecord?

在普通的java中我会使用: public User(String name, String email) { this.name = name; this.email = f(email); this.admin = false; } 但是,我在使用ActiveRecords的rails(3.2.3)中找不到一种简单的标准方法。 1.覆盖初始化 def initialize(attributes = {}, options = {}) @name = attributes[:name] @email = f(attributes[:email]) @admin = false end 但是从DB创建记录时可能会错过 2.使用after_initialize回调 通过覆盖它: def after_initialize(attributes = {}, options = {}) … end 或者用宏: after_initialize : my_own_little_init def my_own_little_init(attributes = […]

ActiveRecordvalidation…自定义字段名称

我想修复一些我的网站生成的错误消息。 这是问题所在: class Brand < ActiveRecord::Base validates_presence_of :foo … end 我的目标是发出消息“需要门票描述”而不是“需要Foo”或者可能不是空白,或者其他什么。 这是如此重要的原因是因为我们之前说过该字段是ticket_summary。 这很好,服务器编码使用它,但现在由于疯狂疯狂的业务分析师已经确定ticket_summary是一个糟糕的名称,应该是ticket_description。 现在,我不一定希望我的数据库由用户对字段名称的要求驱动,特别是因为它们可以在不更改function的情况下频繁更改。 是否有提供此function的机制? 澄清 :message =>似乎不是正确的解决方案,:消息会给我“Foo [message]”作为错误,我希望更改消息生成的字段名称,而不是实际的消息本身(虽然我会满足于不得不改变整个事情)。

如何覆盖自定义数据库适配器的rake任务?

我编写了一个自定义数据库适配器,可以在rails服务器运行时正常有效地工作。 我现在想添加用于创建,删除和迁移数据库的常用rake任务定义。 我想实现: db:[drop|create|migrate] 如何使用我的gem打包这些定义,以便它们覆盖使用gem的任何人的默认定义? 我查看了其他适配器的来源,但所有rake任务逻辑似乎都被烘焙到active_record本身,每个任务只是打开适配器名称。

validationhas_and_belongs_to_many中的至少一个

我有一个模型: has_and_belongs_to_many :users 如何validation模型在模型中至少有一个用户? 我试过了: validates_presence_of :users 但这似乎没有给我我想要的东西……

ActiveRecord查找 – 跳过记录或获取每个第N条记录

我想在一个查询中选择一堆数据,但我希望能够通过仅选择每三个记录,甚至每百个记录来降低该数据的分辨率,或者随你。 使用ActiveRecord有什么简单的方法吗?

undefined方法`default_scoped?’ 在访问范围时

我在访问范围时遇到此错误。 这是AR模型 class StatisticVariable < ActiveRecord::Base attr_accessible :code, :name has_many :statistic_values scope :logins, where(code: 'logins').first scope :unique_logins, where(code: 'unique_logins').first scope :registrations, where(code: 'registrations').first end 当我尝试使用StatisticVariable.logins或其他任何范围时,它会给出: NoMethodError: undefined method `default_scoped?’ 如果我将范围配置为类方法,那么它可以完美地工作。 def self.registrations where(code: ‘registrations’).first end 请指导我理解并解决这个问题。

即使未更改,也要停止ActiveRecord保存序列化列

这与散列的Rails部分更新问题非常相似,但问题并没有真正得到回答恕我直言。 问题是这样的:我有一个带序列化列的模型: class Import < AR::Base serialize :data 就我而言,在第一次保存/创建模型后,这些数据将会,而且应该不会更改。 所以我想禁用AR的function,它始终保存序列化列(这通常是一个好主意,因为它无法检测到这些更改)。 我想禁用保存,因为数据可能非常大,模型会经常更新。 我已经尝试过monkeypatching到ActiceRecord :: AttributeMethods :: Dirty,如下所示: class Import def update(*) if partial_updates? super(changed | (attributes.keys & (self.class.serialized_attributes.keys – [“data”]))) else super end end 但这似乎没有效果。 有人有更好的主意吗? 这是在Rails 3.0.12下

如何为rails-settings插件创建表单

我有一个Rails 3应用程序,需要一些用户定义的设置。 我想使用这个https://github.com/ledermann/rails-settings插件。 我让它在rails控制台中工作。 但我无法在表格中工作。 我是否使用fields_for和attr_accessible? 如果是这样我没有运气。 我需要为两个模型添加设置: 例如,特定于用户的设置, user = User.find(123) user.settings.color = :red user.settings.color # => :red user.settings.all # => { “color” => :red } (以上在控制台中对我来说很好。) 但我需要通过标准的Web表单来管理它们。 我很想知道其他人是如何处理这件事的。 谢谢。