2011-10-11 30 views
5

Tôi có một mô hình người dùng. Người dùng có thể có 1 trong 3 vai trò: role1, role2, role3. Điều này được thể hiện bằng cột 'vai trò' trong mô hình người dùng. Mỗi vai trò có một cấu hình duy nhất. role1_profile, role2_profile, role3_profile. Mỗi * _profile là một mô hình.Các liên kết mô hình tùy chọn hoặc có điều kiện trong Rails

Làm cách nào để thể hiện liên kết tùy chọn này trong Rails?

Tôi đã thử nó hai cách khác nhau:

class User < ActiveRecord::Base 
    #FIRST WAY 
    if current_user.role == 'role1' then has_one :role1_profile end 
    #SECOND WAY 
    has_one :role1_profile, :conditions => ['user.role = ?', 'role1'] 
end 

Nhưng điều đó không làm việc. Cách đúng để làm điều này là gì?

Trả lời

4

Các liên kết không có ý định có điều kiện. Nó có lẽ dễ dàng nhất để giữ cho mọi thứ theo cách đó, quá.

Cách liên kết đa hình giữa User và các cấu hình vai trò khác nhau?

class User 
    belongs_to :role_profile, :polymorphic => true 
end 

class RoleXProfile 
    has_many :users, :as => :role_profile 
end 

Tất nhiên, bạn sẽ cần phải thêm các trường role_profile_idrole_profile_type bảng người dùng của bạn.

Không có vấn đề gì bạn làm, bạn sẽ cần phải kiểm tra vai trò của người dùng hoặc role_profile bất cứ nơi nào bạn sử dụng nó.

+0

+1 vì tôi quá lười để nhập mã. –

+0

Cảm ơn bạn! Tôi nghĩ rằng giải pháp của bạn là hoàn hảo. Luôn luôn có một cách trong Rails, nhưng khi bạn không biết cách, bạn có xu hướng thực hiện một giải pháp một cách kỳ lạ. – hrdwdmrbl

+0

@jackquack Tôi không nghĩ rằng cách tiếp cận của bạn là lạ cả. Hoàn toàn ngược lại, nó rất hợp lý. Và nó cũng có thể chỉ ra một nơi mà ActiveRecord có thể được cải thiện/mở rộng. Dù sao, tôi vui vì bạn có những thứ làm việc. –

4

Thay vào đó, bạn có thể muốn xem xét một polymorphic association và chỉ có hồ sơ vai trò phù hợp.

Hiểu biết của tôi là :conditions là các điều kiện mà liên kết mô hình phải đáp ứng (nhưng tôi có thể sai về điều đó).

Trong mọi trường hợp, tôi nghĩ rằng bạn đang làm điều này khó khăn hơn thực sự và làm xáo trộn những gì bạn thực sự cần bằng cách làm cho các mối quan hệ này có điều kiện.

+0

+1 bởi vì một lập trình viên lười biếng là một lập trình viên giỏi :) và cho lưu ý về các điều kiện được sử dụng cho các hiệp hội –

+0

@WizardofOgz Đó là những gì tôi tiếp tục nói với sếp của mình! Tôi nghĩ đó là ... Ấp? người nói "Ra khỏi sự lười biếng đến sự đổi mới." –

+0

Bạn hoàn toàn đúng! Tôi chỉ đưa cho Wizard lời kể từ khi anh ấy viết mã. :) – hrdwdmrbl

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