通过关联Rails指定has_many中的列

时间:2011-03-21 05:28:04

标签: ruby-on-rails has-many-through

我有三种型号。

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(role)”访问与记录一起返回的庆祝表中的“已接受”列。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分: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个结束。

急切加载会加载您需要与一个查询而不是n个查询相关联的所有数据。

接受的数据仍然存在问题,因为由于与用户的has_many关系,您将有一系列庆祝活动。

您可以使用以下内容:

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