Вопрос

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

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

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

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

Это было полезно?

Решение

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

STI - пример (из гибкой веб-разработки с Rails 3rd Edition)

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)

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

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

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

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

Другие советы

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

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

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

Кроме того, вы могли бы позже удалить STI и разделить :photos и : videos на их собственные отдельные таблицы, ни на йоту не изменяя код модели канала.Забей!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top