Ruby on rails 如何在rails 3中实现开放时间模型

Ruby on rails 如何在rails 3中实现开放时间模型,ruby-on-rails,ruby,ruby-on-rails-3,ruby-on-rails-3.1,Ruby On Rails,Ruby,Ruby On Rails 3,Ruby On Rails 3.1,我想为一家商店实施开放时间模式 目前我有 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_tab

我想为一家商店实施开放时间模式

目前我有

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
然后让商店
有很多:时间表

因此,您可以访问
Store.first.schedules[0]。打开
,依此类推

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

或者,您可以将以下内容添加到
计划表中:

t.string :week_day
然后做
store.schedules。按周(星期一)查找

至于验证,请将其添加到models/store.rb中

validate :has_seven_schedules
...
def has_seven_schedules
   self.schedules.count == 7 ? true : false
end
编辑2:

如果您愿意,您可以在store.rb模型中的某个方法上放置
按周查找(“星期一”)
,如:

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

结束时间也是一样。

我也有这个想法,但如何处理整整7天,意味着它需要有7个孩子的时间表。如何将其作为嵌套属性?我将奖励它150:Pwell,has_many将其作为嵌套属性,在整整7天内查看我的编辑。这是我目前的代码。但是如何使其嵌套,特别是对于json api调用?我怎样才能把一套有开放时间的工作日带进来?那对我来说太难了。我想要一个类似于api/Advertisions/1的调用,数据类似于{Advertision:{opening_times:{monday:{12,20},周二:{12,19}}}但是我不知道如何将它带到控制器中,因为opening_时间的关键是工作日。希望你知道我的意思好的,我可以用这个a.opening_时间(:monday)来设置一天一天.更新属性打开:12,关闭:14