0

Я пытаюсь узнать, как работает STI, и у меня есть модель моего контента, созданная с помощью Post и Article, унаследовавших ее.Rails/STI - общий путь модели

У меня также есть модель комментария. В контроллере комментариев, у меня есть:

def find_content 
    @content = Content.find(params[:content_id]) 
end 

Очевидно, что он не работает, так как PARAMS показывают либо post_id или article_id. Как я могу сообщить контроллеру комментариев, чтобы вытащить соответствующий content_id на основе параметров?

ответ

1

Быстрое исправление может быть:

@content = Content.find(params[:post_id] || params[:article_id]) 

В ваших параметров должны быть либо article_id или post_id. Таким образом, вы можете попытаться поймать оба параметра и объединить их с логическим или оператором (||). Таким образом, вы получаете article_id или post_id, которые вы можете использовать с Content.find.

params 
# => {:article_id=>1, :other_parameter=>"value"} 

params[:post_id] || params[:article_id] 
# => 1 

Если ни один из параметров, вы получите nil и Content.find терпит неудачу с ActiveRecord::RecordNotFound исключением. Все в порядке, я думаю. Позже вы избавитесь от этой ошибки в своем контроллере, чтобы показать страницу 404.

1

Когда вы используете однонаправленное наследование таблицы, вы получаете одну и только одну таблицу со столбцом «type» в ней. Итак, в вашем случае у вас есть «содержимое» таблицы со столбцом «type», в котором вы храните одну из строк: «post» или «article».

При использовании STI в вашем приложении Rails вы должны определить три модели: Content (наследуется от ActiveRecord::Base как обычные моделей), почты и статьи (оба наследуют от Content) и работать с ними непосредственно, например: Post.find, Article.last ,

Поскольку Post и Article являются строками одного и того же «содержимого» таблицы, каждый из них всегда имеет отдельный идентификатор. Я не знаю логики вашего приложения и каких целей вы пытаетесь достичь (например, я не могу понять, что должно быть логическим различием между Post и Article), но я предлагаю реализовать это действие из вашего примера как:

def find_content 
    @content = Post.find_by_id(params[:content_id]) || Article.find_by_id(params[:content_id] 
end 

Я использую .find_by_id не .find, потому что второе сгенерирует исключение вам нужно обрабатывать/спасение и первый будет возвращать nil.

Конечно, мой пример не изящный, но я надеюсь, что вы поймете суть.

Смежные вопросы