has_many и наследование одной таблицы - PullRequest
6 голосов
/ 20 мая 2009

У меня есть отношение has_many между двумя сущностями, Лентами и Сообщениями. У меня также есть определенные типы сообщений, видео и фотографий. Это структурировано в базе данных с использованием наследования одной таблицы.

Прямо сейчас у меня есть модель фида, определяющая отношение has_many между фидами и сообщениями (включая подтипы)

class Feed < ActiveRecord::Base
  has_many :posts
  has_many :photos
  has_many :videos

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

Ответы [ 3 ]

5 голосов
/ 02 июня 2009

Если я вас правильно понимаю, у вас есть сообщения, и сообщения могут быть как видео, так и фото. как сказал Джарил, то, что у вас есть, вероятно, легче всего понять / обработать, однако, если вы хотите получить фантазию, вы можете использовать наследование одной таблицы или полиморфные ассоциации.

STI - пример (из Agile Web Development с Rails 3-е издание)

create_table :people, :force => true do |t|
   t.string :type

   #common attributes
   t.string :name
   t.string :email

   #attributes for type=Customer
   t.decimal :balance, :precision => 10, :scale => 2

   #attributes for type=Employee
   t.integer :reports_to
   t.integer :dept

   #attributes for type=Manager
   #none
end

class Person < ActiveRecord::Base
end

class Customer < Person
end

class Employee < Person
   belongs_to :boss, :class_name => "Manager", :foreign_key => :reports_to
end

class Manager < Person
end

Так что, если вы создаете клиента

Customer.create(:name => 'John Doe', :email => 'john@doe.com', :balance => 78.29)

вы можете найти его через человека

x = Person.find_by_name('John Doe')
x.class #=> Customer
x.email #=> john@doe.com
x.balance #=> 78.29
x.some_customer_class_method # will work because the Person.find method returned a Customer object

Так что вы могли бы иметь

class Post < ActiveRecord::Base
end
class Photo < Post
end
class Video < Post
end

и затем вы можете найти их все по Post.all, но вы получите обратно объекты Фото и Видео (и разместите объекты, если у вас есть сообщения, которые не являются фотографиями или видео)

не забывайте строку: введите в вашей таблице БД

2 голосов
/ 21 мая 2009

Это самое простое, что вы можете сделать.

Что ж, если к фотографиям можно относиться так же, как к видео, то, возможно, вы могли бы покончить с STI и использовать именованные области для предоставления доступа к различным типам контента.

0 голосов
/ 08 июля 2009

Я согласен, что пример в вопросе настолько прост, насколько это возможно. Он уже использует ИППП и четко указывает на ассоциации.

Кроме того, вы можете позже извлечь STI и разделить: photos и: video на отдельные таблицы без изменения кода модели Feed на один бит. Оценка!

...