Ассоциация между двумя таблицами не работает - PullRequest
0 голосов
/ 24 мая 2019

Я новичок в RoR и хочу создать простую страницу, такую ​​как диспетчер задач (для добавления и удаления задач), поэтому я создал 2 таблицы с ассоциацией между ними (Track и Item). Вот 2 модели:

class Item < ApplicationRecord
  belongs_to :track, optional: :true
end

class Track < ApplicationRecord
  has_many :items, dependent: :destroy
end

И мне нужно установить связь, когда я создаю или удаляю любой элемент трека. Но когда я его создаю, я просто вижу свой элемент трека (с пустым полем в связанной таблице)

For example: 
rails c
Track.create(item: 'Asafa Pauel', description: 'This is a description') - works fine (added all field to db)
Item.all - track_id field is empty - but it should show id of track item. Why is this?

И мой контроллер треков:

class TracksController < ApplicationController
  def index
    @track = Track.all
  end

  def show
    @track = Track.all
  end

  def new
    @track = Track.new
  end

  def create
    @track = Track.new(track_params)
    @item = Item.new(track_id: @track.id)
    if @track.save! && @item.save!
      flash[:success] = "It works!"
      redirect_to tracks_path
    else
      flash[:success] = "Its wrong!"
    end
  end

private
  def track_params
    params.require(:track).permit(:item, :description)
  end
end

И элементы управления:

class ItemsController < ApplicationController
  def create
    @item = Item.new(item_params)
  end

  private
  def item_params
    params.require(:item).permit(:track_id)
  end
end

И схема БД:

ActiveRecord::Schema.define(version: 2019_05_23_112947) do

  enable_extension "plpgsql"

  create_table "items", force: :cascade do |t|
    t.bigint "track_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["track_id"], name: "index_items_on_track_id"
  end

  create_table "tracks", force: :cascade do |t|
    t.string "item"
    t.string "description"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

end

Заранее спасибо

1 Ответ

0 голосов
/ 24 мая 2019

У вашего нового объекта 'Track' еще нет идентификатора, поэтому вы не можете присвоить его значение Item.track_id.

Сначала вам нужно сохранить трек, а затем создать новыйItem.

Кроме того, если вы создаете новый трек из консоли, вы не будете запускать свой метод «создания» в контроллере: он будет вызываться только в том случае, если вы создаете новый трек из браузера.Если вы хотите создавать новый элемент каждый раз, когда создаете трек, вам нужно будет сделать что-то подобное в файле модели «track.rb»:

after_save :create_new_item

def create_new_item
    self.items.create
end

PS: «track.rb»"файл находится в" app / models "в вашем приложении Rails.

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