2012-01-17 48 views
9

Tôi có một mô hình gọi là loại mà trông như thế này:Tiếp cận đối tượng cha mẹ từ đối tượng của đứa trẻ trong Rails

class Category < ActiveRecord::Base 
    has_many :categories 
    belongs_to :category,:foreign_key => "parent_id" 
end 

tôi có một cái nhìn trong đó cho thấy tất cả các thư mục với một số thuộc tính của chúng. Tôi có thể truy cập category.parent_id, nhưng tôi muốn có thể làm điều gì đó như category.parent_name.
Tôi có thể thấy mình tạo phương thức mô hình để tìm nạp tất cả các danh mục và điền vào bộ sưu tập với tên cha mẹ của mỗi danh mục, nhưng tôi tự hỏi liệu có cách nào để thực hiện việc này dễ dàng không.

EDIT: tôi đã sửa đổi mô hình để có nó như thế này:

class Category < ActiveRecord::Base 
    has_many :children, :class_name => 'Category', :foreign_key => 'parent_id' 
    belongs_to :parent, :class_name => 'Category', :foreign_key => 'parent_id' 
end 

Việc chuyển đổi sang tạo các loại bảng là như thế này:

class CreateCategories < ActiveRecord::Migration 
    def change 
    create_table :categories do |t| 
     t.string :name 
     t.text :description 
     t.integer :parent_id 

     t.timestamps 
    end 
    end 
end 

Tuy nhiên khi tôi vượt qua một thể loại đối tượng với chế độ xem tôi không thể truy cập thuộc tính gốc của nó bằng cách thực hiện category.parent.name - Thực hiện một đối tượng đó inspect cho tôi:

<Category id: 2, name: "Test 2", description: "Prova 2", parent_id: 1, created_at: "2012-01-17 19:28:33", updated_at: "2012-01-17 19:28:33"> 

Và nếu tôi làm một kiểm tra của category.parent tôi có được điều này:

#<Category id: 1, name: "Prova", description: "Test", parent_id: nil, created_at: "2012-01-17 19:28:17", updated_at: "2012-01-17 19:28:17"> 

Tuy nhiên nếu tôi cố gắng làm category.parent.name tôi nhận được lỗi sau:

undefined method `name' for nil:NilClass 

EDIT2: Tôi đã cố gắng để truy cập vào một phụ huynh không có trước đối tượng mà tôi đã đề cập ở trên. Việc làm này:

category.parent.try(:name) 

theo đề nghị của Michael Irwin tại một trong những câu trả lời giải quyết nó.

Trả lời

12

hiệp hội tự tham khảo rất khó trong lần đầu tiên ...

class Category < ActiveRecord::Base 
    has_many :children, :class_name => 'Category', :foreign_key => 'parent_id' 
    belongs_to :parent, :class_name => 'Category', :foreign_key => 'parent_id' 
end 

Sau đó, bạn có thể gọi category.childrencategory.parent và cũng truy cập vào tất cả các thuộc tính của oobjects asscoiated, ...

+0

davidb cảm ơn câu trả lời. Tại sao bạn khai báo hai khóa nước ngoài có cùng tên trong lệnh ass_hiện và thuộc về? – Nobita

+1

Một khóa ngoại của nó nhưng nhìn từ hai phía khác nhau ... – davidb

+0

Tôi đã giải thích vấn đề của mình thêm một chút bằng cách sử dụng các sửa đổi bạn đã đề xuất. Hãy xem liệu tôi có hiểu tôi đang làm gì sai không. – Nobita

5

tôi m không chắc chắn tôi hoàn toàn hiểu câu hỏi của bạn, nhưng category.parent.name sẽ hoạt động. Nếu danh mục không có cha hoặc mẹ, hãy làm điều gì đó như category.parent.try(:name) để tránh bị NoMethodError.

+0

Tôi đã chỉnh sửa câu hỏi để làm rõ hơn. Cảm ơn – Nobita

+0

không có ý tưởng tại sao không có lỗi phương pháp xảy ra, nhưng điều này đã giúp rất nhiều. cảm ơn –

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