Какие Rails ассоциации использовать и как их использовать - PullRequest
1 голос
/ 19 марта 2020

У меня есть Rails API, который в настоящее время имеет две модели, HelpCategory и HelpRequest.

Каждый экземпляр HelpRequest может быть связан только с одним экземпляром HelpCategory. Каждый экземпляр HelpCategory может быть связан со многими экземплярами HelpRequest.

. При создании нового экземпляра HelpRequest я хочу иметь возможность добавить идентификатор экземпляра HelpCategory в HelpRequest.

Например, я хотел бы иметь возможность сделать что-то подобное.

HelpCategory.create!(title: "Help with Shopping")
# {id: 1, title: "Help with Shopping"}
HelpRequest.create!(title: "Please help me to collect my shopping", help_category_id: 1)
# {id: 4, title: "Please help me to collect my shopping", help_category_id: 1}

Чтобы я мог сделать что-то вроде

request = HelpRequest.find(4)
# {id: 4, title: "Please help me to collect my shopping", help_category_id: 1}
request.help_category.title
# "Help with Shopping"

Может кто-нибудь помочь мне понять, как это настроить?

1 Ответ

0 голосов
/ 19 марта 2020

Это всего лишь ваша попытка объединения мельница один ко многим.

class AddHelpCategoryIdToHelpRequest < ActiveRecord::Migration[5.2]
  def change
    add_reference :help_requests, :help_categories, index: true
  end
end

Это добавляет столбец help_category_id к таблице help_requests и внешний ключ. Затем добавьте ассоциации:

class HelpRequest < ApplicationRecord
  belongs_to :help_category
end

class HelpCategory < ApplicationRecord
  has_many :help_requests
end

belongs_to сообщает ActiveRecord, что внешний ключ находится в этой таблице. has_many сообщает Rails, что на эту модель ссылаются из другой таблицы.

Затем вы можете назначить категорию, передав идентификатор или запись:

help_category= HelpCategory.create!(title: "Help with Shopping")

hr = HelpRequest.create!(
  title: "Please help me to collect my shopping", 
  help_category: help_category
)
# This is primarily done indirectly through the params
hr = HelpRequest.create!(
  title: "Please help me to collect my shopping", 
  help_category_id: help_category.id
)

Вы также можете просто создать / инициализировать записи вне ассоциации:

hr = help_category.help_requests.create!(
  title: "Please help me to collect my shopping", 
)
...