2011-03-21 59 views
0

我有三種模型。指定有很多通過關聯的列導軌

User 
has_many :boards through => :celebrations 
has_many :celebrations, :dependent => :destroy 

Board 
has_many :celebrations, :dependent => :destroy 
has_many :users, :through => :celebrations do 
      def by_role(role) 
      find(:all, :conditions => ["celebrations.role = ?", role]) 
      end 
      end 

Celebration 
:belongs_to :user 
:belongs_to :board 

慶典表

create_table :celebrations do |t| 
     t.column :board_id,  :int, :null => false 
     t.column :user_id,   :int, :null => false 
     t.column :role,   :string, :null => false 
     t.column :token,   :string 
     t.column :accepted, :boolean, :default => false 
     t.timestamps 

在控制器:

@board = Board.find(session[:board_id]) 
    @friends = @board.users.by_role("FRIEND") 

在視圖:

<% for friend in @friends do %> 
<%= friend.name %> 
<%= friend.email %> 

然而,當我執行以下操作:

<% friend.celebration.accepted %> 

我得到以下錯誤:

undefined method `celebration' for #<User:0x104788c00> 

我如何可以訪問的慶祝活動表「接受」列返回隨着使用模型擴展「by_role(角色)」的記載。

非常感謝您的幫助。

+0

什麼是用戶和慶祝活動之間的關聯。 'has_many'或'has_one'。你沒有在你的代碼中提到它。我認爲它是'has_many',所以你應該調用'friend.celebrations'並根據你的需要調用'friend.celebrations.first.accepted'或者其他什麼。 – rubyprince 2011-03-21 06:12:26

+0

與@rubyprince一致,你正在與用戶(朋友)對象交談,就好像它是關係中的多對一方一樣,但它確實是一對多的一面。 – 2011-03-21 06:38:28

+0

我的appologies。我忘記了關係。我想我試圖避免另一個數據庫命中並應用急切的加載。我希望有一個查詢將返回來自Users表和來自慶典表的'accepted'列的所有數據。然後以friend.celebrations.accepted的身份訪問信息。有沒有辦法做到這一點使用急切加載? – chell 2011-03-21 08:19:13

回答

0

你可以貪婪加載這樣的慶祝活動:

主板型號:

Board 
    has_many :celebrations, :dependent => :destroy 
    has_many :users, :through => :celebrations do 
    def by_role(role) 
     find(:all, :conditions => ["celebrations.role = ?", role], :include => :celebrations) 
    end 
    end 

用:包括你將有一個更命中:

Celebration Load (0.2ms) SELECT celebrations.* FROM celebrations WHERE (celebrations.user_id IN (5,6)) 

加載慶祝活動數據用戶。 這將避免在這種特定情況下兩次檢索每個用戶的慶祝活動所需的命中。如果你有10個用戶,你將以一個命中而不是10個結束。

Eager loading會加載所有需要循環的數據,而不是一個查詢而不是n個查詢。

問題依然存在於接受的數據中,因爲由於與用戶的has_many關係,您將有一系列慶祝活動。

您可以使用這樣的事情:

<% friend.celebrations.map{|celeb| celeb.accepted }.join(",") %> 
+0

非常感謝Tommasop。我會給它一個鏡頭並回復你。 – chell 2011-03-21 12:51:22

+0

是的,請讓我知道! – tommasop 2011-03-21 14:10:10

+0

嗨,Tommasop,我完全按照上面所描述的方式進行操作,並從終端獲得相同的輸出。意味着與數據庫相同的命中。也許eagerloading發生? – chell 2011-03-22 03:53:54