2010-04-21 8 views
19

विफल रहता है मुझे नहीं पता कि क्या गलत हुआ है, लेकिन मुझे class_name विकल्प के साथ काम करने के लिए संबंधित नहीं मिल सकता है। क्या कोई मुझे प्रबुद्ध कर सकता है। आपका बहुत बहुत धन्यवाद!इसके साथ संबंधित है: class_name विकल्प

यहां मेरे कोड से एक स्निप है।

class CreateUsers < ActiveRecord::Migration 
    def self.up 
     create_table :users do |t| 
      t.text :name 
     end 
    end 

    def self.down 
     drop_table :users 
    end 
end 

##################################################### 

class CreateBooks < ActiveRecord::Migration 
    def self.up 
     create_table :books do |t| 
      t.text :title 
      t.integer :author_id, :null => false 
     end 
    end 

    def self.down 
     drop_table :books 
    end 
end 

##################################################### 

class User < ActiveRecord::Base 
    has_many: books 
end 

##################################################### 

class Book < ActiveRecord::Base 
    belongs_to :author, :class_name => 'User', :validate => true 
end 

##################################################### 

class BooksController < ApplicationController 
    def create 
     user = User.new({:name => 'John Woo'}) 
     user.save 
     @failed_book = Book.new({:title => 'Failed!', :author => @user}) 
     @failed_book.save # missing author_id 
     @success_book = Book.new({:title => 'Nice day', :author_id => @user.id}) 
     @success_book.save # no error! 
    end 
end 

पर्यावरण:

रूबी 1.9.1-p387 रेल 2.3.5

उत्तर

6

यह

belongs_to :user, :foreign_key => 'author_id' 

होना चाहिए, अगर अपने विदेशी कुंजी लेखक आईडी है। चूंकि आपके पास वास्तव में उपयोगकर्ता वर्ग है, इसलिए आपकी पुस्तक का होना चाहिए: उपयोगकर्ता।

52
class User < ActiveRecord::Base 
    has_many :books, :foreign_key => 'author_id' 
end 

class Book < ActiveRecord::Base 
    belongs_to :author, :class_name => 'User', :foreign_key => 'author_id', :validate => true 
end 

सबसे अच्छी बात करने के लिए अपने प्रवास को बदलने और user_id को author_id बदलने के लिए है। फिर आप :foreign_key विकल्प को हटा सकते हैं।

+6

मैं अच्छा विदेशी कुंजी होने के बारे में परवाह है। मैं कॉलम का नाम बदलने के बारे में सुझाव लागू नहीं करूंगा, क्योंकि कॉलम का सही नाम होने पर क्या हो रहा है यह स्पष्ट है। –

+1

किसी भी तरह से काम करता है। जो कुछ भी आपको और आपकी टीम के लिए समझ में आता है वह सही काम है। :) –

+2

और यह सोचने के लिए कि class_name: 'उपयोगकर्ता' पर्याप्त होगा – Donato

0

मैं इस तरह से कार्य करें:

प्रवासन -

class AddAuthorToPosts < ActiveRecord::Migration 
    def change 
    add_reference :posts, :author, index: true 
    add_foreign_key :posts, :users, column: :author_id 
    end 
end 

वर्ग पोस्ट

belongs_to :author, class_name: "User" 
संबंधित मुद्दे