0

店舗に開店時間モードを実装したい。

現在私は持っています

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

私はこのソリューションに快適さや柔軟性を感じていませんが、より良い方法で実装するアイデアはありません

4

1 に答える 1

1

という別のテーブルを作成できます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")

検証に関しては、それをmodels/store.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 についても同様です。

于 2013-01-10T20:37:21.860 に答える