Rails - сохранение нескольких значений в базе данных с помощью флажка - PullRequest
0 голосов
/ 28 июня 2019

У меня есть модель 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 .

Ответы [ 3 ]

1 голос
/ 28 июня 2019

То, что вы хотите, это таблица соединения между вашими моделями пользователей и интересов.

. Вы хотите иметь что-то вроде этого

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

# 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

Обновите ваши модели, чтобы рассказать об этом, у него есть интересы (посмотрите на рельсы через учебное пособие )

# 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
1 голос
/ 28 июня 2019

Насколько я понимаю, вы хотите сохранить несколько процентов в каждой вашей записи 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
0 голосов
/ 28 июня 2019

При отправке формы params["investor_profile"]["interested_in"] вернет массив строк из interests в вашем контроллере.

Вот почему самое простое решение с использованием метода rails - сохранить это значение в текстовом столбце interested_in в таблице investor_profiles.

Просто добавьте следующий код в вашей модели в сериализуйте массив.

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

Тогда вы можете легко сохранять параметры без форматирования.

Я сделал предположение, что interests - это всего лишь список тегов, и у вас нет interests таблицы.

Пределом сериализации является то, что вы не можете использовать эффективный SQL-запрос для фильтрации investor_profiles по их интересам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...