2 пользовательских класса для 1 модели в Rails

Можно ли создать одну модель для двух разных объектов? например:

У меня есть блог, на котором я буду публиковать статьи на чистом тексте и скринкасты только с видео.

С этим в мыслях:

я хочу получить только все сообщения => @posts = Posts.all
я хочу получить только все скринкасты => @posts = Screencasts.all
и я хочу получить только все статьи => @posts = Articles.all

И по мнению я хочу знать, какой класс этот пост

<% if @posts.first is article %>
  do something
<% else %>
  do something else
<% end %>

если это невозможно, как я могу сделать что-то подобное?

1 ответ

Решение

Вы могли бы использовать Single Table Inheritance для достижения этой цели, но я не уверен, что это лучшее решение.

У вас будет модель Post с обычным столбцом; тело, текст и screencast_url или что-то подобное для вашей скринкаста. Теперь волшебство происходит путем добавления столбца "type" в виде строки. Rails будет использовать это для отслеживания унаследованной модели.

После этого вы можете получить обе модели от Post.

class Post < ActiveRecord::Base
end

class Screencast < Post
end

class Article < Post
end

Теперь ваш пример кода должен работать так, как вы хотите. Вы можете найти больше информации о STI на этой странице Rails API

Ваш цикл может быть примерно таким:

<% @posts.each do |post| %>
  <% if post.class == Article %>
    do something
  <% elsif post.class == Screencast %>
    do something else
  <% end %>
<% end %>
Другие вопросы по тегам