【问题标题】:using end as column name使用 end 作为列名
【发布时间】:2010-07-15 19:05:01
【问题描述】:

我正在维护一个 Rails 2.1 应用程序,它对列名有一些不幸的选择。例如,事件具有开始日期和结束日期。原始设计没有使用start_atend_at,而是使用startend。当然这会导致

  def end
    read_attribute(:end) || 1.hour.from_now
  end

我很惊讶这甚至可以解析。这是合法的红宝石吗?真正的问题是,在运行 backgroundrb 作业以发送提醒电子邮件时,erb 因“堆栈级别太深”而爆炸。模板是

    <%= [@event.name, @event.when_pretty, @event.location, @event.association,
 @event.notes].reject(&:blank?) * "\n" %>

如果我在控制台中deliver_reminder没有错误,但是在后台作业期间调用deliver_reminder时出现错误。

问题:我应该重构删除end方法,还是堆栈错误是由其他原因引起的?

在 foo/mailer/reminder.rhtml 的第 1 行

1: <%= [@event.name, @event.when_pretty, @event.location, @event.association, @event.notes].reject(&:blank?) * "\n" %>

lib/virtual_attributes_and_associations.rb:59:in `virtual_attribute_names'
lib/virtual_attributes_and_associations.rb:83:in `read_attribute_without_virtual'
lib/virtual_attributes_and_associations.rb:86:in `read_attribute'
vendor/rails/activerecord/lib/active_record/base.rb:2720:in `send'
vendor/rails/activerecord/lib/active_record/base.rb:2720:in `clone_attribute_value'
vendor/rails/activerecord/lib/active_record/dirty.rb:127:in `write_attribute'
vendor/rails/activerecord/lib/active_record/attribute_methods.rb:211:in `data='
lib/virtual_attributes_and_associations.rb:9:in `included'
vendor/rails/activesupport/lib/active_support/callbacks.rb:177:in `call'
vendor/rails/activesupport/lib/active_support/callbacks.rb:177:in `evaluate_method'
vendor/rails/activesupport/lib/active_support/callbacks.rb:161:in `call'
vendor/rails/activesupport/lib/active_support/callbacks.rb:93:in `run'
vendor/rails/activesupport/lib/active_support/callbacks.rb:92:in `each'
vendor/rails/activesupport/lib/active_support/callbacks.rb:92:in `send'
vendor/rails/activesupport/lib/active_support/callbacks.rb:92:in `run'
vendor/rails/activesupport/lib/active_support/callbacks.rb:272:in `run_callbacks'
vendor/rails/activerecord/lib/active_record/callbacks.rb:298:in `callback'
vendor/rails/activerecord/lib/active_record/base.rb:1450:in `send'
vendor/rails/activerecord/lib/active_record/base.rb:1450:in `instantiate'
vendor/rails/activerecord/lib/active_record/base.rb:582:in `find_by_sql'
vendor/rails/activerecord/lib/active_record/base.rb:582:in `collect!'
vendor/rails/activerecord/lib/active_record/base.rb:582:in `find_by_sql'
vendor/rails/activerecord/lib/active_record/base.rb:1341:in `find_every'
vendor/rails/activerecord/lib/active_record/base.rb:1376:in `find_one'
vendor/rails/activerecord/lib/active_record/base.rb:1362:in `find_from_ids'
vendor/rails/activerecord/lib/active_record/base.rb:537:in `find'
vendor/rails/activerecord/lib/active_record/associations/belongs_to_association.rb:44:in `find_target'
vendor/rails/activerecord/lib/active_record/associations/association_proxy.rb:196:in `load_target'
vendor/rails/activerecord/lib/active_record/associations/association_proxy.rb:99:in `reload'
vendor/rails/activerecord/lib/active_record/associations.rb:1084:in `contact'
lib/association.rb:52:in `associated_object'
lib/association.rb:48:in `association'
vendor/rails/activerecord/lib/active_record/associations/association_proxy.rb:177:in `send'
vendor/rails/activerecord/lib/active_record/associations/association_proxy.rb:177:in `method_missing'
app/views/foo/mailer/reminder.rhtml:1:in `_run_erb_47app47views47foo47mailer47reminder46rhtml'

【问题讨论】:

  • 我对此了解不多,但我相信您可以给某些列“别名”,以便您可以将其重命名为 end_at 用于 Active Record

标签: ruby-on-rails activerecord


【解决方案1】:

原来问题出在名为 association 的库方法上,当我将其更改为调用 associated_object(由 Association#association 调用)时,堆栈错误不再发生。

【讨论】:

    猜你喜欢
    • 2011-07-31
    • 2014-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 2023-03-11
    相关资源
    最近更新 更多