2011-09-24 39 views
12

Tôi muốn có Trang tổng quan để hiển thị tóm tắt nhiều mô hình và tôi đã triển khai đối số bằng cách sử dụng Trình dẫn mà không có dữ liệu riêng. Tôi sử dụng một lớp ActiveModel (không có bảng dữ liệu):Cách chuyển đối số cho phương thức ủy nhiệm trong Rails

class Dashboard 
    attr_accessor :user_id 
    def initialize(id) 
    self.user_id = id 
    end 

    delegate :username, :password, :to => :user 
    delegate :address, :to => :account 
    delegate :friends, :to => :friendship 

end 

Bằng đại biểu, tôi muốn để có thể gọi Dashboard.address và trở lại Account.find_by_user_id(Dashboard.user_id).address.

Nếu Trang tổng quan là lớp ActiveRecord, thì tôi có thể đã khai báo Dashboard#belongs_to :account và ủy nhiệm sẽ hoạt động tự động (tức là, Tài khoản sẽ biết nó sẽ trả về thuộc tính địa chỉ từ tài khoản user_id bằng to user_id trong trường hợp Trang tổng quan).

Nhưng Trang tổng quan không phải là lớp ActiveRecord, vì vậy tôi không thể khai báo belongs_to. Tôi cần một cách khác để báo cho Tài khoản tra cứu đúng hồ sơ.

Có cách nào để khắc phục sự cố này không? (Tôi biết tôi có thể giả mạo Bảng điều khiển để có một bảng trống, hoặc tôi có thể viết lại phương pháp dụ của người dùng để phương pháp lớp mà có đối số. Nhưng những giải pháp này là tất cả các hack).

Cảm ơn bạn.

+0

Điều này không có ý nghĩa nhiều. 'Id' là gì? Đó có phải là một con số không? (Bạn không thể 'gửi (" 123 ")', đó không phải là tên phương thức hợp lệ.) Bạn không thể sử dụng 'Bảng điều khiển.user_id' với' attr_accessor: user_id', một là một lớp và lớp kia là cá thể. .. Vui lòng làm rõ và đưa ra ví dụ về cách bạn mong đợi điều này hoạt động. –

+0

Xin chào Andy, có thể tôi không đủ rõ ràng. Xin lưu ý rằng đây không phải là lớp ActiveRecord :: Base thông thường. Vì vậy, tôi cần một thuộc tính để giữ id của current_user. (Tôi không muốn giữ id này vĩnh viễn). Bởi đại biểu, tôi muốn để có thể gọi Dashboard.address và lấy lại Account.find_by_user_id (Dashboard.user_id) .address. Tôi đã cố gắng ủy nhiệm hàm này cho lớp Account, nhưng tôi cần chuyển giá trị user_id vào tài khoản bằng cách nào đó, để nó biết được cá thể tài khoản nào cần làm việc với nó. – AdamNYC

Trả lời

10

Khi bạn viết delegate :address, :to => :account, điều này tạo ra một phương pháp mới address trên Bảng điều khiển cơ bản mà gọi phương thức account trên cùng một đối tượng và sau đó gọi address vào kết quả của phương pháp account này. Đây là (rất gần) giống như viết:

class Dashboard 
... 
    def address 
    self.account.address 
    end 
... 
end 

Với lớp hiện tại của bạn, tất cả các bạn phải làm là tạo ra một phương pháp account trả về tài khoản với đúng user_id:

class Dashboard 
    attr_accessor :user_id 
    def initialize(id) 
    self.user_id = id 
    end 

    delegate :username, :password, :to => :user 
    delegate :address, :to => :account 
    delegate :friends, :to => :friendship 

    def account 
    @account ||= Account.find_by_user_id(self.user_id) 
    end 
end 

này sẽ cho phép bạn truy cập vào địa chỉ như thế này:

dashboard = Dashboard.new(1) 
# the following returns Account.find_by_user_id(1).address 
address = dashboard.address 
+0

Cảm ơn Benoit. Đó chính là điều tôi đang tìm kiếm. – AdamNYC

+0

@AdamNYC Đừng ngần ngại yêu cầu làm rõ nếu bạn có bất kỳ nghi ngờ nào về mã trên, tôi sẽ sẵn sàng giải thích thêm. –

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