2 пользовательских класса для 1 модели в Rails - PullRequest
1 голос
/ 11 июля 2011

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

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

Имея это в виду:

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

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

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

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

1 Ответ

4 голосов
/ 11 июля 2011

Для достижения этой цели вы могли бы использовать 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 %>
...