Rails: наследование одной таблицы и поиск (: все) в родительском - PullRequest
3 голосов
/ 09 апреля 2009

Я понимаю, как работает STI, в этом я говорю модель Post, которая содержит сообщения на форуме и несколько вложенных сообщений, таких как «normalUserPost» и «adminUserPost» и т. д.

Теперь я хочу определить один и тот же метод в каждом из подпостов, но метод будет делать что-то свое в каждом случае, например

class Post < ActiveRecord::Base
end

class AdminUserPost < Post
  def background_color
    'rockstar red'
  end
end

class OrdinaryUserPost < Post
  def background_color
    'pale blue'
  end
end

(да, это глупый пример). Теперь в моем контроллере потока я делаю Post.find (: все), и это дает мне список сообщений, которые мне нужно сделать, но они «Опубликовать» объекты, а не AdminUserPost или OrdinaryUserPost - поэтому я не могу просто получите мой метод background_color! Я должен был бы найти на каждый тип сообщения пользователя отдельно ...

Могу ли я в любом случае сделать:

Post.find(:all)

И в результирующем массиве получить список AdminUserPost и Объекты OrdinaryUserPost вместо объектов Post?

Или есть хороший способ «приведения» моих объектов Post в AdminUserPost и OrdinaryUserPost в зависимости от ситуации?

EDIT:

Это работает должным образом - при условии, что у вас есть столбец с именем 'type' в классе Post. Если ваш столбец называется чем-то другим, например, post_type, вам нужно добавить:

self.inheritance_column = 'post_type'

Во ВСЕХ дочерних моделях (AdminUserPost и OrdinaryUserPost в этом примере) и в родительских (Post).

Спасибо

Стивен.

Ответы [ 3 ]

7 голосов
/ 09 апреля 2009

Дважды проверьте, что в таблице сообщений есть столбец «тип» (строка). Если AdminUserPosts и OrdinaryUserPosts записаны в таблицу «posts», а столбец type указан правильно, вы должны получить ожидаемое поведение подкласса.

1 голос
/ 10 апреля 2009

Это работает как положено - при условии, что у вас есть столбец с именем «type» в классе Post. Если ваш столбец называется чем-то другим, например, post_type, вам нужно добавить:

self.inheritance_column = 'post_type'

Во ВСЕХ дочерних моделях (в этом примере AdminUserPost и OrdinaryUserPost) и в родительских (Post).

0 голосов
/ 09 апреля 2009

Post.find (: all) даст вам сообщение, потому что вы переходите в Post, а не в AdminUserPost Если вы хотите использовать AdminUserPost:

AdminUserPost.find(:all)

но я думаю, он найдет те же сообщения, что и Post.find (: all).

Я думаю, named_scope поможет вам:

# in model
Class Post << ActiveRecord::Base
  named_scope :admin_posts, :conditions => {:owner == 'admin'}
  named_scope :ordinary_user_posts, :condition => {:owner != 'admin'}
end

# in controller
@posts = Post.admin_posts # returns admin posts

# or
@posts = AdminUserPost.admin_posts # returns admin posts in AdminUserPost class 

Я не пытался использовать эти унаследованные классы, но думаю, что это сработает.

Подробнее об именованных областях вы можете узнать здесь: http://railscasts.com/episodes/108-named-scope

EDIT:

Извините, я новичок в сообществе Rails и раньше не слышал о STI. dbarker прав, я пробовал, и он работает, как вы хотели.

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