2013-10-15 35 views
0

我對Active Record關聯存在問題,並且想知道是否有人可以將我指向正確的方向。我會盡力解釋我的問題,但我甚至不知道該怎麼稱呼它。ActiveRecord關聯:通過多個表獲取數據

我在我的數據庫中有三個表都是相互關聯的,我需要從一個視圖文件中的三個表中的每一個調用信息。

在主題內可以有多個帖子,每個帖子(和主題)都有一個用戶附加到它。我需要能夠使用Post和Topics在用戶表中調用數據。

問題:如何通過多個模型從表中獲取數據。 (主題 - >發表 - >用戶)

模型

class Topic < ActiveRecord::Base 
    belongs_to :forum 
    has_many :posts, :dependent => :destroy 
    belongs_to :user 
end 

class Post < ActiveRecord::Base 
    belongs_to :topic 
    belongs_to :user 
end 

class User < ActiveRecord::Base 
    has_many :topics 
    has_many :posts, through: => :topics 
end 

在視圖/主題/ show.html,我試圖顯示誰張貼的用戶。當我嘗試獲取信息時,它給我提供了「名稱」未定義方法的錯誤。我想是這樣的:

http://i44.tinypic.com/1z4kapj.png

舉例:1後,通過用戶名

查看/雲淡風輕/ Show.html.erb

<% @topic.posts.each do |post| %> 
    <tr> 
     <td class="subforum" width="80%"> 
      <%= post.created_at %> 
      <div class="go-right"> 
       <%= link_to 'Edit', edit_post_path(@post) %> 
      </div> 
     </td> 
    </tr> 

    <tr> 
     <td class="row1"> 
      <%= post.users.name %> 
      <%= post.user_id %> 
     </td> 
    </tr> 
    <tr> 
     <td class="row1"> 
      <%= post.content %> 
     </td> 
    </tr> 
<% end %> 
+1

順便說一句,你寫了「控制器」,但這些都是你發佈的模型。我假設這只是一個錯字。 –

+1

你是對的,謝謝。 – Lindsiria

回答

2

你做它是正確的,除了你應該調用post.user,而不是post.users

在您的Post模型中,您有一條線belongs_to :user。這意味着Post型號具有單個User對象。也就是說,您可以通過關聯名稱的單數形式來訪問依賴對象,在這種情況下只需.user。如果你用這種關係使用複數形式,你會得到一個無用的(在這種情況下)集合代理,正如你所看到的那樣,它的行爲與你的對象不一樣。

如果你有這樣的事情has_many :users,那麼你的確會使用。多元.users,你會得到User對象的集合,在同是作爲Topics.posts給你一個集合Post對象。

ALSO:

在這一行:link_to 'Edit', edit_post_path(@post),溝@象徵,它應該是link_to 'Edit', edit_post_path(post)。請記住,此符號引用了一個實例變量,它與具有相同名稱的本地範圍變量完全不同(換句話說,@post!= post)。

希望有所幫助。

+1

很好回答了兄弟! – mjnissim

+0

我試過post.user。的名字,我結束了同樣的錯誤: 未定義的方法'名稱」的零:NilClass 我已經想盡辦法,我能想到的,使其工作,而事實並非如此。我有一種感覺,我失去了模型中的東西,這就是爲什麼它不工作。 – Lindsiria

+0

@lindsiria啊哈,錯誤信息的最後部分使所有的差異。如果您熟悉Java,則這與空指針異常相同。這意味着你從該方法中沒有收到任何東西,並試圖在該「無對象」上調用方法。換句話說,那個特定的'Post'對象沒有關聯的'User'對象。 –

相關問題