【问题标题】:Clean Rails way to have a child collection linked by checkboxes干净的 Rails 方法让子集合通过复选框链接
【发布时间】:2014-03-20 01:37:09
【问题描述】:

原来如此

我有一个名为 Offer 的表/类

并引用了名为OfferDay 的表/类(因为一周中的 x 天都有优惠)

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

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

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

是的,当然,我可以在我的 .erb 中循环一周中的几天并检查实例的子集合(天),但是在回发时自动绑定到实例呢? - 这似乎是我们以前都见过的那种跑腿工作,应该有一个约定。

是的,我在 Google 上搜索过...找到了一些,但不完全...任何特定于这个的?

【问题讨论】:

  • 这是一个相当模糊的问题——很难回答。它也主要基于意见,这意味着它将触发近距离投票。我会考虑向我们展示您拥有的代码,并让我们帮助迭代以获得更好的解决方案。

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


【解决方案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 %>

【讨论】:

  • 感谢您的详细回复。虽然形式不对。如果我们说 5 天或已经填满并开始编辑,我们会看到 35 (7x5) 个复选框。同样对于新记录,我们根本看不到任何复选框..
  • 感谢您的反馈 - 您希望我为您编辑吗?我看到您已经编辑了答案(不知道您是否自己修复了它!)
  • 只是在做一些感觉有点老套但可能会奏效的东西——在f.fields_for :days 的第一次迭代后返回——但这并不能解决新记录问题
  • 那味道太糟糕了,所以最后,我使用了循环和 checkbox_tags 以及控制器中对子记录的一些(传统)自定义处理......但感谢我从帖子中学到了
猜你喜欢
  • 2012-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多