我有一个带标题的服务模型:字符串描述:字符串日期:日期时间。我想实现一个基于日期模式创建多个服务的系统,例如:当用户在10月20日创建新服务时,他可以选择每月“重复”一次,持续5个月。由于10月20日,11月20日等原因,最终结果应该是创建了6项服务。 我实现这个的方式是工作,但真的很难看。在我看来,我有类似的东西:
<input type="radio" name="each" value="none" checked="true"/>No<br/>
<input type="radio" name="each" value="week"/>Each week for <input type="text" name="weeks_number" /> weeks.<br/>
<input type="radio" name="each" value="month"/>Each month for <input type="text" name="months_number" /> months.<br/>
在我的控制器中,我计算各种服务发生的日期,而不是创建N服务对象(其中N是params [:weeks_number]或params [:months_number]中指定的数字)并保存每个服务对象。< / p>
这听起来不太好,是吗?首先,我正在考虑将创建“多个”服务的所有逻辑转移到模型中。下一件大事是:如何清理视图和控制器?我希望我的控制器像
一样简单@service = Service.new(params[:service])
为了做到这一点,我将不得不改变模型中的某些东西(这应该被称为虚拟属性),以便让控制器相信像
这样的东西@service.repeat_method = "month"
@service.repeat = 6
实际上是有意义的,并且在调用@ service.save时会导致在我的数据库中创建6个不同的行。
这是我陷入困境并需要帮助的地方。我的推理是否有意义?以及如何实现这个?
谢谢。
答案 0 :(得分:0)
我不会在服务实例上使用repeat_method
和repeat
属性来执行您在问题中描述的魔法。我有一个create_repeats
方法,如下所示:
# Create repeats of this Service
# how_many:: the number of repeats to create
# repeat_method:: whether to repeat 'weekly' or 'monthly'
def create_repeats(how_many, repeat_frequency)
# Set the first thing to be cloned as this instance
rep = self
# Create how_many copies increasing the date each time
how_many.times do
rep = rep.clone
if repeat_frequency == 'weekly'
rep.date += 1.week
elsif repeat_frequency == 'monthly'
rep.date += 1.month
else
raise "Unrecognized repeat frequency."
end
rep.save!
end
end
然后您的控制器代码将如下所示:
@service = Service.new(params[:service])
if @service.save
if !params[:weeks_number].blank?
repeats = params[:weeks_number].to_i
repeat_frequency = 'weekly'
elsif !params[:months_number].blank?
repeats = params[:months_number].to_i
repeat_frequency = 'monthly'
end
@service.create_repeats(repeats, repeat_frequency)
end
我知道这不会将所有逻辑推迟到模型中,但是一些参数确实需要特定的逻辑来确定它们如何从视图转换到模型层。
您可能还想检查params[:weeks_number]
或params[:months_number]
是否为有效号码,并且用户未指定这两者。
答案 1 :(得分:0)
我遵循了Shadwell的建议。虽然没有全部移动到模型,但我最终得到了相当干净的视图和控制器:
查看:
<%= radio_button_tag :repeat_type, :none %> No<br/>
<%= radio_button_tag :repeat_type, :week %> Every week for <%= text_field_tag :repeat_weeks %> weeks.<br/>
<%= radio_button_tag :repeat_type, :fixed_month %> Every month for <%= text_field_tag :repeat_fixed_months %> months. (Eg. Oct 2, Nov 2, etc.)<br/>
<%= radio_button_tag :repeat_type, :fluid_month %> Each month for <%= text_field_tag :repeat_fluid_months %> months. (Eg. last Sunday of March, last sunday of April, etc.)
控制器:
def create
@service = Service.new(params[:service])
if @service.save
frequency = params[:repeat_type]
how_many = params[("repeat" + frequency + "s").to_sym]
@service.create_repeats(how_many, frequency)
redirect_to @service, :notice => "Servizio creato."
else
render :action => :new
end
end
型号:
def create_repeats(how_many, frequency)
replica = self
how_many.times do
replica = replica.clone
case frequency
when "week" then
replica.date += 1.week
when "fixed_month" then
replica.date += 1.month
when "fluid_month" then
replica.date = replica.date.next_similar_date
else
return
end
replica.save!
end
end