Clean Rails方式通过复选框链接子集合

时间:2014-03-20 01:37:10

标签: ruby-on-rails rails-activerecord has-many

这就是事情

我有一个名为Offer

的表/类

引用的名为OfferDay的表/类(因为商品在一周的x天提供)

这只是一个非常简单的问题。

是否有用于编辑此类内容的Ruby on Rails约定?

我的Offer管理员表单应该有7个复选框,为此实例预先填充OfferDays(或不是)

是的,当然,我可以在我的.erb中循环几周,并检查实例的子集合(天),但是如何自动绑定到postbacK上的实例? - 这似乎是我们以前见过的那种腿法,应该有一个惯例。

是的我用Google搜索了......发现它有点像,但不完全......对于这个有什么特别的?

1 个答案:

答案 0 :(得分:1)

我处理has_many关系:

#app/models/offer.rb
Class Offer < ActiveRecord::Base
   has_many :days, -> { select(:day_id) }, class_name: "OfferDay", foreign_key: "offer_id"
   accepts_nested_attributes_for :days
end

Class OfferDay < ActiveRecord::Base
   belongs_to :offer
end

offer_days
id | offer_id | day_id #-> put indexes on day_id & offer_id

您可以致电@offer.days以显示您的优惠所在的日期。它当然会返回一个数字,然后您将使用Date class或类似的

转换为一天

<强>修改

这将允许您为每个优惠分配任意天数(并且每个天都是唯一的)。我这样更新:

#app/controllers/offers_controller.rb
def new
   @offer = Offer.new
   @offer.days.build
end

def create
   @offer = Offer.new(offer_params)
   @offer.save
end

private

def offer_params
    params.require(:offer).permit(:offer, :attributes, days_attributes: [:day_id])
end

#app/views/offers/new.html.erb
<%= form_for @offer do |f| %>
   <%= f.text_field :offer %>
   <%= f.text_field :attributes %>
   <%= f.fields_for :days do |builder| %>
       <% 7.times do |day| %>
          <%= builder.check_box :day_id, day %> #-> need label for each day
       <% end %>
   <% end %>
<% end %>