如何在rails 3中实现opening_time模型



我想实现一个商店的开业时间模式。

目前我有

Class Store
  has_one :opening_table
  #return opening_times as an array
  def opening_times
    self.build_opening_table unless opening_table
    (0..6).collect{ |i| 
      [opening_table.read_attribute("open_#{i}"),opening_table.read_attribute("close_#{i}") ]
    }      
  end
  def opening_times=(attr)
    self.build_opening_table unless opening_table
    i=0
    attr.each do |el|
      opening_table.attributes= {"open_#{i}".to_sym => el[0]}
      opening_table.attributes= {"close_#{i}".to_sym => el[1]}
      i=i+1
    end
 end

和OpeningTable有字段open_0, close_0表示星期一的开放和关闭时间

 create_table :opening_tables do |t|
  t.references :advertisement, :null=>false
  (0..6).each do |i|
    t.integer "open_#{i}"
    t.integer "close_#{i}"
  end
  t.timestamps
end

我对这个解决方案感到不舒服和灵活,但是我没有一个更好的方法来实现它

您可以创建另一个名为Schedule的表

create_table :schedules do |t|
   t.integer 'open'
   t.integer 'close'
   t.integer store_id
   t.timestamps
end

然后使存储为has _many :schedules

可以访问Store.first.schedules[0].open等等

编辑:对于嵌套属性,您只需通过store.schedules[0]

访问

或者您可以添加到schedules表:

t.string :week_day

,然后做store.schedules.find_by_week_day("monday")

至于验证,将其添加到您的模型/存储中。rb
validate :has_seven_schedules
...
def has_seven_schedules
   self.schedules.count == 7 ? true : false
end

EDIT2:

如果你愿意,你可以把find_by_week_day("monday")放在store内的方法上。Rb模型,如:

def opening_time(day)
   schedule = self.schedules.find_by_week_day(day)
   unless schedule.nil?
       return schedule.open
   end
end

对于closing_time.

也是如此

相关内容

  • 没有找到相关文章