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ó.
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
Một khóa ngoại của nó nhưng nhìn từ hai phía khác nhau ... – davidb
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