2011-07-15 71 views
7

Tôi là một noob bắt đầu với ruby ​​trên đường ray và cố gắng hiểu mô hình. Khá quen thuộc với cơ sở dữ liệu và muốn hiểu khi nào tạo mô hình cho một mối quan hệ?Ruby on Rails - Mô hình và bảng mối quan hệ

Ví dụ - tôi có bảng người dùng và bảng tiện ích. Mỗi người dùng có thể có nhiều tiện ích. Tôi muốn lưu trữ mối quan hệ này trong bảng quan hệ với user_id và gadget_id. Tôi đã tạo ra hai bảng bằng cách sử dụng các đường ray tạo mô hình Người dùng và các đường ray tạo ra mô hình cmd Gadget.

Câu hỏi - Bây giờ tôi có tạo mô hình khác được gọi là users_gadgets không? Quy ước đặt tên có đúng không? Tôi đã thấy rất nhiều tài liệu về cách tạo liên kết (has_many, depends_to) nhưng không hiểu khi nào tôi cần tạo mô hình?

Tôi có phải tạo mô hình mỗi lần tôi muốn lưu trữ mối quan hệ trong cơ sở dữ liệu và sau đó chạy di chuyển của mình không?

Trả lời

4

bạn có thể làm điều đó một trong hai cách

1) has_and_belongs_to_many trong trường hợp này bạn chỉ cần một bảng (không có mô hình) gadgets_users với gadget_id user_id, đường ray thích các tên bảng là số nhiều theo thứ tự abc

2) has_many: thông qua, đây không phải là 'bình thường' có nhiều, trong trường hợp này bạn sẽ cần một mô hình (có thể được đặt tên là bất cứ điều gì bạn thích) tôi thích cái này hơn người kia vì nó cho phép bạn để thêm các thuộc tính bổ sung vào mối quan hệ nếu cần

xem hướng dẫn, nó không công việc một cách tốt hơn giải thích hơn tôi có thể http://guides.rubyonrails.org/association_basics.html#choosing-between-has_many-through-and-has_and_belongs_to_many

cũng - railscasts - http://railscasts.com/episodes/47-two-many-to-many

Tôi có phải tạo ra mô hình mỗi khi tôi muốn lưu trữ một mối quan hệ trong một cơ sở dữ liệu và sau đó chạy di chuyển của tôi? Có, hầu hết thời gian

+0

Cảm ơn house9! Để cung cấp cho bạn một số bối cảnh nhiều hơn, tôi đang sử dụng để làm việc trực tiếp trong mysql tạo ra các bảng và sau đó viết mã của tôi. Vì vậy, thiết lập mô hình là một chút bối rối. Đối với # 1 tôi chỉ cần tạo bảng trực tiếp trong mysql? – countdrak

+0

@coutdark Tôi nghĩ bạn nên sử dụng di chuyển tốt hơn để có thể giúp tạo bảng dễ dàng. – PeterWong

1

Tôi thấy rằng cách hữu ích nhất để suy nghĩ về điều này là suy nghĩ về các mô hình liên quan đến logic của ứng dụng và các bảng liên quan đến dữ liệu. Ví dụ: người dùng của bạn có tên, chiều cao và cân nặng. Đây là các thuộc tính của người dùng và được lưu trữ trong bảng. Chúng có thể truy cập thông qua các thuộc tính của mô hình. Nhưng người dùng cũng có thể có Chỉ số khối cơ thể được tính toán từ chiều cao và cân nặng. Đây là một phương thức của mô hình, nhưng chỉ liên quan gián tiếp đến cơ sở dữ liệu.

Cá nhân, tôi sẽ luôn tạo mô hình cho bảng cơ sở dữ liệu. Nó dễ dàng hơn để làm theo cách này, làm cho nó dễ dàng hơn để viết mã ruby ​​sạch mà không có nhiều câu lệnh SQL, và nếu tại một thời điểm nào đó trong tương lai bạn muốn thêm logic vào mô hình nó dễ làm.

+0

Cảm ơn điều này rất hữu ích! – countdrak

5

Mô hình quan hệ chỉ có ý nghĩa đối với mối quan hệ N-to-N như bạn đã mô tả. Khi bạn chọn sử dụng has_and_belongs_to_many, bạn không cần phải tạo một mô hình nối, nhưng bạn vẫn phải tạo bảng kết nối thông qua di chuyển. Quy ước đặt tên là gadgets_users, vì 'g' trước 'u' trong bảng chữ cái.

Nếu bạn chọn has_many: thông qua, bạn có thể lưu trữ thông tin bổ sung trong bảng tham gia thông qua mô hình tham gia GadgetUser. Ví dụ nếu bạn muốn ghi lại rằng một tiện ích thuộc về một người dùng trong một thời gian nhất định, thì thông tin thời gian này một cách hợp lý thuộc về "kết nối" giữa tiện ích và người dùng, do đó bạn nên giữ nó trong bảng kết nối.

+0

Cảm ơn điều này rất hữu ích! – countdrak

0

Install gem install nước ngoài

add sau dòng để tập đá quý

đá quý 'nước ngoài'

sau khi xem xét rằng sau liên kết

https://github.com/matthuhiggins/foreigner

+0

Nếu có thể, hãy cố gắng bao gồm tóm tắt về bất kỳ liên kết bên ngoài nào bạn tham chiếu. Điều này là để nếu, trong tương lai, liên kết chết ít nhất một số thông tin hữu ích được giữ lại và nó không phải tất cả bị mất. – niemiro

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