2009-05-20 37 views
6

Tôi có mối quan hệ has_many giữa hai thực thể, Nguồn cấp dữ liệu và Bài đăng. Tôi cũng có các loại bài đăng, Video và Ảnh cụ thể. Điều này được cấu trúc trong cơ sở dữ liệu sử dụng kế thừa bảng đơn.has_many và thừa kế bảng đơn

Ngay bây giờ tôi đã mô hình thức ăn của tôi xác định một mối quan hệ giữa has_many Feeds và bài viết (bao gồm các phân nhóm)

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

Có một cách thông thường hơn tốt hơn để xác định điều này? Hoặc là những gì tôi có đơn giản như nó có thể nhận được?

Trả lời

4

Nếu tôi hiểu chính xác bạn, bạn có Bài đăng và bài đăng có thể là video hoặc ảnh. như Jaryl cho biết những gì bạn có có lẽ là dễ hiểu nhất/xử lý tuy nhiên nếu bạn muốn có được ưa thích, bạn có thể sử dụng đơn thừa kế bảng hoặc các hiệp hội polymophic.

STI - ví dụ (từ Agile Phát triển Web với 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 

Vì vậy, nếu bạn tạo ra một khách hàng

Customer.create(:name => 'John Doe', :email => '[email protected]', :balance => 78.29) 

sau đó bạn có thể tìm thấy nó thông qua người

x = Person.find_by_name('John Doe') 
x.class #=> Customer 
x.email #=> [email protected] 
x.balance #=> 78.29 
x.some_customer_class_method # will work because the Person.find method returned a Customer object 

Vì vậy, bạn có thể có

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

và sau đó bạn có thể tìm thấy tất cả chúng bằng Post.all nhưng bạn sẽ nhận lại hình ảnh và video đối tượng (và sau đối tượng nếu bạn có bài viết mà không phải là hình ảnh hoặc video)

không quên chuỗi: nhập vào bảng db của bạn

+1

http://stackoverflow.com/questions/3231889/rails-sti-with-inheriting-children Tôi đang cố gắng tìm ra cách để có STI đối tượng con, vì vậy với ví dụ đã cho, tôi sẽ viết mã như thế nào " Người thuộc_to: company "và" Company has_many: persons "? – Rabbott

1

Đây là cách đơn giản nhất bạn có thể thực hiện.

Vâng, nếu ảnh có thể được xử lý giống như video, thì có lẽ bạn có thể loại bỏ STI và sử dụng phạm vi được đặt tên để cung cấp cho người truy cập các loại nội dung khác nhau.

0

Tôi đồng ý rằng ví dụ trong câu hỏi đơn giản như vậy. Nó đã được sử dụng STI và nêu rõ các hiệp hội.

Ngoài ra, bạn có thể trích xuất STI sau và chia nhỏ: ảnh và video thành các bảng riêng biệt của riêng chúng mà không thay đổi mã của mô hình Nguồn cấp dữ liệu một chút. Ghi bàn!

Các vấn đề liên quan