9

tôi đã thiết lập một vai trò dựa trên hệ thống truy cập controll với các mô hình sau:Có thể tạo ra một liên kết có điều kiện trong mô hình không?

  • Vai trò (như STI),
    • UserRole (vai trò toàn cầu)
    • (vai trò cụ thể dự án)
    • ProjectRole
  • Chuyển nhượng (Đa hình với các tài nguyên khác nhau)
  • Người dùng
  • Proj ect (như một loại tài nguyên cho các bài tập)

Người dùng chỉ được phép chịu trách nhiệm về dự án nếu họ có UserRole cụ thể. Userrole này là tên "chịu trách nhiệm về dự án" và có ID 2.

Trong mô hình người dùng có hai liên kết has_many: responsibility_assignments và responsibility_projects. Kết hợp này chỉ hợp lệ nếu người dùng có UserRole "chịu trách nhiệm cho dự án" có ID 2.

Có thể tạo liên kết có điều kiện trong mô hình người dùng cho liên kết chịu trách nhiệm không? quan hệ?

Cách tốt nhất để giải quyết loại vấn đề này là gì?

class Role < ActiveRecord::Base 
    has_many :assignments 
    has_many :users, :through => :assignments 

class UserRole < Role 

class ProjectRole < Role 

class Assignment < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :role 
    belongs_to :resource, :polymorphic => true 

class User < ActiveRecord::Base 
    has_many :assignments 
    has_many :roles, :through => :assignments, 
        :class_name => "UserRole" 
    has_many :responsible_assignments, :class_name => "Assignment", 
            :conditions => { :role_id => 4 }  // specific project role 
    has_many :responsible_projects, :through => :responsible_assignments, 
           :source => :resource, 
           :source_type => 'Project', 
           :conditions => { :status => 1 }   // project is active 
    ... 

class Project < ActiveRecord 
    ... 
+0

Ý anh là gì bởi một hiệp hội có điều kiện ? Điều kiện là gì? – Yanhao

+0

Điều kiện là: nếu người dùng không có vai trò với id 2, trách nhiệm_ * liên kết không hợp lệ/không nên được đặt. – tonymarschall

Trả lời

7

Bạn không thể đặt các điều kiện như vậy trong các liên kết. Những thứ như vậy được xử lý trong phạm vi.

Đọc http://guides.rubyonrails.org/active_record_querying.html#scopes để biết thêm thông tin.

Ví dụ cho tình trạng của bạn,

Bạn muốn tất cả các bài tập (id) dưới một người sử dụng với vai trò dự án cụ thể

scope :responsible_users, where('users.role_id = 4') 
scope :select_assignment_ids, select('assignments.id') 
scope :responsible_assignments, joins(:assignments).responsible_users.select_assignment_ids 

Bạn muốn tất cả các dự án (id), dưới một người dùng với một dự án cụ thể vai trò, đang hoạt động.

scope :active_projects, where('projects.status = 1') 
scope :select_project_ids, select('projects.id') 
scope :responsible_projects, joins(:assignments => :projects).responsible_users.active_projects.select_project_ids 
1

Các liên kết đó được tạo khi tải mô hình. Tình trạng của bạn không được biết tại thời điểm đó. Bạn chỉ có thể bao gồm các điều kiện trong các liên kết để lọc ra các bản ghi không mong muốn.

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