Rails-使用复选框在数据库中存储多个值

时间:2019-06-28 10:59:52

标签: ruby-on-rails ruby database postgresql

我正在使用模型 investor_profile.rb

我正在一个字段中,他/她可以在复选框中选择各种选项(获取业务,向业务贷款...)。下面的表单代码。

<%= form_with model: @investor_profile do |f| %>
      <%= f.label :interested_in %>
      <% interests.each do |activity| %>
        <%= f.check_box :interested_in, { multiple: true }, activity, nil %>
       <% end %>
      <%= f.submit %>
<%= end %>

如何设计用于存储多个值的数据库?如果是单个值,则可以将其存储在 investor_profile 表的 interested_in 列中。

3 个答案:

答案 0 :(得分:1)

据我了解,您希望在每个Investor_profiles记录中保存几种权益。

您必须创建第三个模型Investor_interests,在这里您将拥有所有的利息选项。 您还需要连接表,例如名为investor_profile_interests,该表将同时属于投资者兴趣和投资者资料。在investor_profile_interests表中,您将具有investor_profile_id和investor_interest_id。

So that:
InvestorProfile has many InvestorProfileInterest
InvestorProfileInterest belongs to InvestorProfile
InvestorProfileInterest belongs to InvestorInterest

在这种情况下,您将与Investor_interests建立多对多关系,并且能够在每个配置文件上存储多个兴趣。

连接表如​​下所示:

**investor_profile_id**  **investor_interest_id**    
-----------------------------------------------------
        1                        1
        1                        2
        1                        3

答案 1 :(得分:1)

您想要的是用户模型和兴趣模型之间的联接表

您想要这样的东西

users table
id
1
2
3

interests table 
id name
1 "interest 1"
2 "interest 2"
3 "interest 3"

interest_users table (the join table)
id interest_id user_id
1  1           1        # User 1 is interesed in interest 1
1  2           1        # User 1 is interesed in interest 2
1  3           1        # User 1 is interesed in interest 3
1  3           2        # User 2 is interesed in interest 3

User 3 is interesed in nothing!

让我们用滑轨来做

首先通过迁移create_join_table rails documentation

创建join_table
# db/create_join_table_user_interest.rb
class CreateJoinTableUserInterest < ActiveRecord::Migration[5.1]
  def change
    create_join_table :user, :interest do |t|
      t.index %i[user_ud interest_id]
      t.index %i[interest_id user_ud]
    end
  end
end

然后创建联接模型InterestUser,联接模型的每一行都属于两个表!

# models/user_interest.rb
class InterestUser < ApplicationRecord
  belongs_to :user
  belongs_to :interest
end

更新您的模型以告诉它它有兴趣(请查看rails through tutorial

# model/user.rb
class User < ApplicationRecord
  has_many :user_interests
  has_many :interests, through: :user_interest
end

# model/interest.rb
class Interest < ApplicationRecord
  has_many :user_interests
  has_many :user, through: :user_interest
end

答案 2 :(得分:0)

提交表单时,params["investor_profile"]["interested_in"]将从控制器中的interests返回一个字符串数组。

这就是为什么使用rails方法最简单的解决方案是将此值存储在interested_in表中的文本列investor_profiles中。

只需在模型中将以下代码添加到serialize数组中即可。

class InvestorProfile < ActiveRecord::Base
  serialize :interested_in, Array
end

然后,您可以轻松保存参数而无需格式化。

我假设interests只是一个标记列表,而您没有interests表。

序列化的局限性在于您不能使用有效的SQL查询来过滤Investor_profiles的兴趣。