2011-08-27 112 views
0

我有以下型號:的Rails:活動記錄問題

require 'books_projects.rb' 

class Project < ActiveRecord::Base 
    has_many :book_to_projects 
    has_many :books, :through => :book_to_projects 
end 

require 'books_projects.rb' 

class Book < ActiveRecord::Base 
    has_many :book_to_projects 
    has_many :projects, :through => :book_to_projects 
end 

books_projects.rb:

class BookToProject < ActiveRecord::Base 
    set_table_name "books_projects" 
    belongs_to :book 
    belongs_to :project 
end 

在我的項目控制,我試圖做到這一點:

@projects = Project.find(:all, :include => [:books]) 

我的希望是獲得一個嵌套的數據結構,如下所示:

projects: [ 
    { 
    .., 
    books: [ 
     { 
      .. 
     }, 
     { 
      .. 
     } 
    ] 
    } 
] 

這不起作用。我怎樣才能做到這一點?

另外,上述模型關係是否需要在項目和書中使用has_and_belongs_to_many而不是指定連接表?

在此先感謝!

編輯1: 我沒有看法。這僅起到REST服務的作用。我正在做以下操作:

def index 
    @projects = Project.find(:all, :include => [:books]) 

    respond_to do |format| 
    format.xml { render :xml => @projects } 
    format.json { render :json => @projects} 
    end 
end 

這不會產生我正在查找的輸出(如上所述)。

+0

好吧,它應該工作!在你的視圖中嘗試<%= debug @project%>,你會看到你的對象的yaml表示,包括書籍 – charlysisto

+2

如果'book_projects'沒有任何其他屬性,那麼是的,使用'has_and_belongs_to_many'。此外,我同意charlysisto:它*應該*工作?什麼不正確? – Mischa

+0

我可以問你爲什麼「違背糧食」?爲什麼你有一個定義'BookToProject'的文件'book_projects.rb',但表名是'book_projects'?你爲什麼要從其他兩個模型中獲取這個文件?你只需要在項目的某個地方需要它,但爲什麼你需要呢? – theIV

回答

1

所以事實證明了以下工作:

def index 
    @projects = Project.find(:all) 

    respond_to do |format| 
    format.json { render :json => @projects.to_json(:include => [:books]) } 
    end 
end 

誰能告訴我,爲什麼這個作品和一個之前沒有?

+0

如果這有效,您應該將其標記爲正確的答案。這就是說,似乎'to_json'不會默認包含關聯,因此它之前沒有工作,並且需要明確包含它們。 – theIV

+0

啊!謝謝!是的,我會在大約3個小時後標記它。它現在不讓我這樣做.. –

1

您的代碼完全符合您的期望。問題在於驗證。

試試這個:

project = Project.find(:first) 
project.books.loaded? 

將返回false

project = Project.find(:first, :include => [:books]) 
project.books.loaded? 

將返回true :)

急切裝載協會通常不顯示當您檢查的對象。