我有三种型号。
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)”访问与记录一起返回的庆祝表中的“已接受”列。
提前感谢您的帮助。
答案 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(",") %>