2010-12-29 44 views
8

Tôi đang xây dựng một ứng dụng quản lý khoảng không quảng cáo với bốn loại người dùng khác nhau: quản trị viên, nhân viên, nhà sản xuất, người vận chuyển. Tôi đã không bắt đầu mã hóa, nhưng đây là những gì tôi đang suy nghĩ .. Các nhà sản xuất và vận chuyển có liên quan với has_many: thông qua nhiều-nhiều hiệp hội với các sản phẩm như sau:Nhiều vai trò người dùng trong Ruby on Rails

class Manufacturer < ActiveRecord::Base 
has_many :products 
has_many :transporters, :through => :products 
end 

class Product < ActiveRecord::Base 
belongs_to :manufacturer 
belongs_to :transporter 
end 

class Transporter < ActiveRecord::Base 
has_many :products 
has_many :manufacturers, :through => :products 
end 

Tất cả bốn loại người sử dụng sẽ có thể đăng nhập, nhưng chúng sẽ có các quyền và chế độ xem khác nhau, v.v. Tôi không nghĩ rằng tôi có thể đặt chúng trong cùng một bảng (Người dùng), tuy nhiên, vì chúng sẽ có các yêu cầu khác nhau, tức là: nhà cung cấp và nhà sản xuất phải có địa chỉ thanh toán và thông tin liên hệ (thông qua xác thực), nhưng quản trị viên và nhân viên không nên có các trường này.

Nếu có thể, tôi muốn có một màn hình đăng nhập duy nhất thay vì 4 màn hình khác nhau.

Tôi không yêu cầu mã chính xác để tạo điều này, nhưng tôi đang gặp khó khăn khi xác định cách tốt nhất để thực hiện điều đó. Bất kỳ ý tưởng nào cũng sẽ được đánh giá cao - cảm ơn!

Trả lời

5

tiếp cận cơ bản của bạn có vẻ hợp lý. Tôi khuyên bạn nên tạo một lớp cơ sở của Người dùng và sử dụng STI cho các loại Người dùng cụ thể, ví dụ:

class User < ActiveRecord::Base 
end 

class Manufacturer < User 
has_many :products 
has_many :transporters, :through => :products 
end 

... v.v. Bằng cách này nếu có nhu cầu tổng hợp nhiều loại người dùng thành một mối quan hệ bất kể loại, bạn có một bảng để mô tả Người dùng nói chung. Đây là một cách tiếp cận khá phổ biến.

Tùy thuộc vào mức độ truy cập của những người dùng khác nhau đối với hệ thống, bạn có thể muốn xem xét đá quý Quản lý vai trò như Declarative Authorization.

+0

Cảm ơn sự giúp đỡ! Các bảng cơ sở dữ liệu sẽ được thiết lập như thế nào, với một lớp cơ sở của User và STI cho các kiểu User cụ thể? Tôi thực sự, thực sự mới với đường ray :) – aguynamedloren

+0

Bạn sẽ chỉ có bảng 'người dùng' trong db. Ngõ thừa kế STI/Single Table sử dụng trường 'type' trong bảng cơ sở (trong trường hợp này là 'users') để phân biệt giữa các kiểu con của lớp cơ sở. Bạn cần phải thêm trường này trong quá trình di chuyển. Sau đó, tất cả các thuộc tính cho tất cả các kiểu con của lớp cơ sở sẽ được lưu giữ trong bảng người dùng, mặc dù nhiều thuộc tính sẽ không được sử dụng bởi các cá thể/hàng cụ thể. Đây là sự cân bằng bằng cách sử dụng mẫu STI - bạn có thể có một số trường rỗng cho các thuộc tính không được sử dụng, tùy thuộc vào có bao nhiêu thuộc tính kiểu con cụ thể. –

1

Tôi khuyên bạn nên tạo Mô hình người dùng, Mô hình địa chỉ, Mô hình ContactInfo, v.v. Bạn KHÔNG nên có các loại trường đó trong Mô hình người dùng. Bình thường hóa cơ sở dữ liệu. Có một FK trong mỗi lớp học khác để User.id.

Nếu bạn PHẢI giữ chúng riêng biệt, sau đó bình thường hóa thông tin đăng nhập và làm cho nó đa hình để tham khảo chủ sở hữu của nó (nhà sản xuất, nhân viên, vv)

+0

Weeeelll ... có thể. Có một bảng địa chỉ chắc chắn được chuẩn hóa, nhưng trong thế giới thực nhiều lần nó quá mức cần thiết, và trên thực tế thường xuyên hơn cả những freaks bình thường hóa lõi cứng sẽ thừa nhận rằng một cái gì đó giống như địa chỉ - hơn một trường varchar - không cần phải được chuẩn hóa vào bảng riêng của nó với tất cả các chi phí phát sinh. Bạn có thực sự muốn một lần truy cập tham gia SQL cho truy vấn bao giờ của người dùng không? Không phải rất giỏi cho một hoạt động đơn giản như vậy. Vì vậy, nhiều phụ thuộc vào tên miền, và liệu địa chỉ có thực sự phức tạp và tái sử dụng, vv –

+0

@ Sim Sims - Tôi hoàn toàn, tôn trọng không đồng ý. Trong thế giới ngày nay, chúng ta cần càng nhiều thông tin càng tốt. Bình thường hóa (đặc biệt là với các địa chỉ) cho phép mở rộng trong tương lai - chúng tôi có thể cho phép người dùng có nhiều địa chỉ (ví dụ như nhà riêng và cơ quan). Và, cho dù SELECT * trả về 10 cột hoặc JOIN trả về 10 cột, nó không quan trọng (giống như trên không nghĩa là không đáng kể đối với các bộ dữ liệu cực kỳ lớn). Hơn nữa, bạn sẽ KHÔNG LUÔN hiển thị địa chỉ với người dùng, vậy tại sao bạn lại có nó trong bảng người dùng? Đó là một đối tượng riêng biệt – sethvargo

+0

@Dave Sims - (con't). Tôi nhìn nó theo cách này. TÔI CÓ một cái tên, tôi CÓ họ. Tôi cũng CÓ một địa chỉ. Tôi KHÔNG CÓ address_line_1 và address_line_2, zip ..., một địa chỉ CÓ address_line_1, 2..zip, v.v.Đối với tôi, nó chỉ làm cho WAY có ý nghĩa hơn để có những thứ này riêng biệt. Bạn có thể có một người dùng không có địa chỉ không? bạn có thực sự muốn hạn chế quyền truy cập vào trang web của bạn nếu ai đó vô gia cư không? Tôi đang ở trên đỉnh, nhưng tôi nghĩ bạn sẽ thấy tại sao việc bình thường hóa lại quan trọng. – sethvargo

4

Đối với nhiều hệ thống người dùng, cách thông thường được ưu tiên là - sử dụng mô hình vai trò hoặc STI. Nếu người dùng của bạn có thể có nhiều vai trò cùng một lúc, như người dùng đơn lẻ là Nhà sản xuất và người vận chuyển thì hệ thống cơ sở Vai trò sẽ là giải pháp tốt. Nếu vai trò của người dùng được sửa, thì tôi nghĩ bạn nên đi với STI.

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