我正在使用模型 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 列中。
答案 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的兴趣。