【问题标题】:Rails 4, Saving arrays in PostgresqlRails 4,在 Postgresql 中保存数组
【发布时间】:2015-11-30 22:23:27
【问题描述】:

我在将数组数据保存到数据库时遇到问题。 目前,我使用的是嵌套表单,有 3 个模型,如下所示。

deal.rb

class Deal < ActiveRecord::Base
  has_many :deal_days, :dependent => :destroy
  accepts_nested_attributes_for :deal_days, allow_destroy: true
end


deal_day.rb

class DealDay < ActiveRecord::Base
  belongs_to :deal
  has_many :deal_times, :dependent => :destroy
  accepts_nested_attributes_for :deal_times, allow_destroy: true
end


deal_time.rb

class DealTime < ActiveRecord::Base
  belongs_to :deal_day
end

我的目标是允许用户在复选框中选择交易正在进行的多天。例如,如果用户选择星期一和星期二,我希望数组中包含星期一和星期二。 下面显示的是我当前的 deal_day 数据库:

create_table "deal_days", force: true do |t|
    t.integer  "deal_id"
    t.string   "day",        default: [], array: true
    t.datetime "created_at"
    t.datetime "updated_at"
end

deal_day 的格式如下,在一个名为 _deal_day_fields 的文件中:

<fieldset>
  Enter Days (e.g Mon - Fri)<br>
  <td><input type = "checkbox" name = "day[]" value = "Mon" /></td>
  <td><input type = "checkbox" name = "day[]" value = "Tue" /></td>
  <td><input type = "checkbox" name = "day[]" value = "Wed" /></td>
  <td><input type = "checkbox" name = "day[]" value = "Thur" /></td>
  <td><input type = "checkbox" name = "day[]" value = "Fri" /></td>
  <td><input type = "checkbox" name = "day[]" value = "Sat" /></td>
  <td><input type = "checkbox" name = "day[]" value = "Sun" /></td>
  <%= link_to "Delete", '#', class: "remove_fields" %><br>
  <%= f.hidden_field :_destroy %>
  <%= f.fields_for :deal_times do |builder| %>
      <%= render 'deal_time_fields', f: builder %>
  <% end %>
  <%= link_to_add_fields "Add another time period", f, :deal_times %>
</fieldset>

对于交易控制器参数,我已将其设置为:

    params.require(:deal).permit(:name_of_deal, :type_of_deal, :description, :start_date, :expiry_date, :location, :t_c,
                             :pushed,:redeemable, :multiple_use, :image,
                             deal_days_attributes: [:id, {day: []}, :_destroy,
                                                    deal_times_attributes: [:id, :started_at, :ended_at, :_destroy]])

当我运行表单时,我的所有数据都正确保存到数据库中,除了 :day 数组。它以 [] 的形式保存到数据库中。
如果有人能告诉我我的错误,我将不胜感激。谢谢!

【问题讨论】:

  • 此链接可能对您有所帮助stackoverflow.com/questions/6360739/…
  • 如果我通过选择星期日进行正确测试,这将保存在数据库中,因为如果你有 N name = "day[]" name = "day[]" ......最后一个将被覆盖并发送到数据库进行存储。
  • 嗨@praaveen,我尝试了你的建议,但它仍然只保存[]。我已经阅读了您发布的链接,如果我无法找到解决方案,我可能会创建 7 个不同的属性来命名星期一到星期日。不过谢谢!
  • 通过打印参数签入你的控制器。
  • 为什么要存储一个数组? SQL 数组是一个巨大的查询痛苦。我建议您为一周中的每一天存储一个布尔值 - 您可以保留复选框结构,并且您可以更轻松地处理和查询数据类型。

标签: ruby-on-rails arrays ruby postgresql


【解决方案1】:

如果您希望控制器参数中的days[] 包含在您在强参数require/permit 语句中发布的deal_days 中,您可以使用表单助手构建它(请参阅http://guides.rubyonrails.org/form_helpers.html#building-complex-forms)。

这是它的样子:

# app/views/deals/_form.html.erb
    ...
    <%= f.fields_for :deal_days do |f_days| %>
        <%= fields_for 'deal[deal_days][]', f_days.object do |f_days_array| %>
            <%= f_days_array.check_box 'Monday' %>
            <%= f_days_array.check_box 'Tuesday' %>
            ...etc..
        <%= f.fields_for :deal_times do |builder| %>
            <%= render 'deal_time_fields', f: builder %>
        <% end %>
    <% end %>

很确定就是这样,或者非常接近。我基于上述 Rails 指南第 7.3 节中的代码。如果您仍然感到困惑,您绝对应该阅读整个页面。

警告:此解决方案无法实现您的既定目标,因为此数据当前与交易相关联,而除了特定交易/交易日之外,它还需要与用户相关联。但这是另一个问题。

【讨论】:

  • 为了进一步阐明差异,通过将您的输入设置为name="day[]",网络浏览器将它们作为day[0] = true, day[1] = true 放在根目录中。如果你有name=deal[deal_day][],你会得到deal =&gt; {deal_day =&gt; {0: true, 1: true, ...}},而你真正需要的是deal_day_attributes =&gt; {0: true, 1: false}' using the fields_for`会自动构建它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-29
  • 2015-02-27
  • 2015-04-28
  • 1970-01-01
  • 2013-06-21
  • 1970-01-01
相关资源
最近更新 更多