Может ли модель принадлежать ребенку ИППП? - PullRequest
0 голосов
/ 22 октября 2018

У меня есть базовый класс Place и несколько подклассов, использующих соглашения STI.У меня есть отдельная модель Post, которая belongs_to один из подклассов Place:

class Place < ApplicationRecord
end

class SubPlace < Place
  has_many :posts, class_name: "SubPlace", foreign_key: "sub_place_id"
end

class Post < ApplicationRecord
  belongs_to :sub_place, class_name: "SubPlace", foreign_key: "sub_place_id"
end

Можно сохранить новую запись Post с помощью консоли Rails, но яполучить следующую ошибку при попытке найти Posts для определенного SubPlace:

ActiveRecord::StatementInvalid (PG::UndefinedColumn: ERROR:  column places.sub_place_id does not exist)

Есть ли способ выполнить эту работу, или мои ассоциации должны относиться только к базовому классу?

Добавлена ​​схема:

create_table "posts", force: :cascade do |t|
    t.string "title"
    t.bigint "sub_place_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["sub_place_id"], name: "index_posts_on_sub_place_id"
end

create_table "places", force: :cascade do |t|
    t.string "name"
    t.string "type"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
end

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Лучший способ справиться с ассоциациями и STI - просто настроить ассоциации для базового класса:

class Place < ApplicationRecord
end

class SubPlace < Place
  has_many :posts, foreign_key: 'place_id', inverse_of: 'place'
end

class AnotherKindOfPlace < Place
  has_many :posts, foreign_key: 'place_id', inverse_of: 'place'
end

class Post < ApplicationRecord
  belongs_to :place
end

Это делает вещи приятными и простыми, поскольку Post не знает и не заботится о том, что есть разныевиды мест.При доступе к @post.place ActiveRecord читает столбец places.type и создает правильный подтип.

Если базовый класс Post также имеет ассоциацию, вы просто пишете его как:

class Place < ApplicationRecord
  has_many :posts, foreign_key: 'place_id', inverse_of: 'place'
end
0 голосов
/ 22 октября 2018

ActiveRecord :: StatementInvalid (PG :: UndefinedColumn: ERROR: столбец place.sub_place_id не существует)

Ваша ассоциация в SubPlace является недействительной ,Вы должны переписать это просто

class SubPlace < Place
  has_many :posts
end
...