2010-04-09 39 views
8

Hi im tạo một trang web nhỏ để giúp tôi và bạn bè học ngôn ngữ. Sử dụng thông thường:làm cách nào để liên kết một mô hình hai lần với một mô hình khác

Adam là tiếng Anh nhưng học tiếng Nhật. Adam có thể thực hành tiếng Nhật của mình bằng cách viết và gửi bài viết bằng tiếng Nhật. Adam không thể (không được phép) gửi bất kỳ bài viết nào được viết bằng ngôn ngữ mẹ đẻ của mình. Adam có thể đọc các bài báo (viết bằng tiếng Anh) bởi những người dùng khác đang học tiếng Anh

Tôi đang cố gắng nghĩ cách tạo mô hình này và minh chứng khó hơn đường ray tiêu chuẩn. đến.

Ill chức năng cần thiết như

-show all articles written in adams native language 
@adam.native_language.articles 

-show all posts written by users just like adam (i.e. learning the same language) 
@adam.foreign_language.articles 

-perhaps showing all posts written by language learners in one particular language 
@language => Japanese 
@langauge.posts 

Tôi cần một người sử dụng, bài viết và mô hình ngôn ngữ. Nhưng làm cách nào để liên kết ngôn ngữ và mô hình người dùng? Có vẻ như ngôn ngữ nên được liên kết hai lần với mô hình người dùng, một lần cho native_language và một lần cho Foreign_language.

Trả lời

18

Vâng, bạn nói đúng. Sự kết hợp giữa Người dùng và Ngôn ngữ được gấp đôi. Tạo mô hình này khá dễ dàng bằng cách sử dụng Rails:

class Language < AR::Base 
    has_many :native_speakers, :class_name => "User", :foreign_key => "native_language_id" 
    has_many :second_language_speakers, :class_name => "User", :foreign_key => "second_language_id" 
    has_many :articles 
end 

class User < AR::Base 
    # we expect the users table to have native_language_id and second_language_id columns 
    belongs_to :native_language, :class_name => "Language" 
    belongs_to :second_language, :class_name => "Language" 
    has_many :second_language_articles, :through => :second_language, :source => :articles 
    has_many :native_language_articles, :through => :native_language, :source => :articles 
end 

class Article < AR::Base 
    belongs_to :language 
end 

Điều gì đó tương tự sẽ hoạt động.

+0

cảm ơn milan thats excellent !, tên của loại liên kết này là gì? – robodisco

+0

Các liên kết giữa người dùng và các bài viết thường được gọi là "has_many: through". –

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