【问题标题】:Rails ActiveRecord/SQL Query best practiceRails ActiveRecord/SQL 查询最佳实践
【发布时间】:2012-01-13 13:54:47
【问题描述】:

我有一个包含以下列的表格:

  • show_days_before_start(整数)
  • 开始时间(日期文本)

“show_days_before_start”列的目的是将天数添加到“start_time”中,以确定记录应该开始出现在结果中的时间(如果超出此时间,则不应显示)(此列可能有值从 7 到 21),“start_time”只是记录所指事件开始的日期时间戳。

我需要一个查询来执行上述操作并返回相关记录。就查询设计而言,解决此问题的最佳方法是什么?

【问题讨论】:

    标签: mysql ruby-on-rails ruby-on-rails-3 performance activerecord


    【解决方案1】:

    这是错误的做法。 您应该在将数据集插入数据库时​​生成显示日期!添加名为display_time的列:

    add_column :table_name, :display_time, :timestamp
    

    然后在模型中为display_time_reader 添加attr_readerattr_accessor

    attr_accessor :display_time_reader
    attr_reader :display_time_reader
    

    然后你定义display_time_reader=方法:

    def display_time_reader=(days_before_start)
         self.display_time=self.start_time-days_before_start.days
    end
    

    然后您添加一个text_field :display_time_reader(您也可以使用值7..21 的下拉菜单)到您的_form.html.erb,当您输入5 时,它会将start_date - 5 天保存到display_time 字段.然后你可以查询:

    ModelName.where("display_time > ?", Time.now) 
    

    这将是处理这个问题的一种干净的方法!

    【讨论】:

    • 感谢您的回复。我收到以下错误undefined method days' for "7":String`
    • 而不是self.display_time=self.start_time-days_before_start.daysself.display_time=self.start_time-days_before_start.to_i.days
    • 我现在看到这个错误:You have a nil object when you didn't expect it! You might have expected an instance of Array. The error occurred while evaluating nil.-
    • Parameters: {"utf8"=>"✓", "authenticity_token"=>"wb7acGREdNH2aeuYjye51wwaWdMXgTYvAcNxoDR9HAE=", "sale"=>{"start_time(3i)"=>"13", "start_time(2i)"=>"1", "start_time(1i)"=>"2012", "start_time(4i)"=>"23", "start_time(5i)"=>"00", "end_time(3i)"=>"14", "end_time(2i)"=>"1", "end_time(1i)"=>"2012", "end_time(4i)"=>"01", "end_time(5i)"=>"00", "display_time_reader"=>"7"}, "commit"=>"create"}
    • 这似乎是正确的!请发布模型的整个代码作为答案,必须有某事。错了!
    猜你喜欢
    • 1970-01-01
    • 2013-01-06
    • 2012-09-26
    • 1970-01-01
    • 2013-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多