Rails - 在关联表中创建记录

4

我想在按钮的操作中创建一个联结表中的记录。具体来说,我有一个事件模型,并希望跟踪每个用户选择的事件。

我使用了HABTM关系,因为我不需要任何额外的字段。

User.rb => has_to_and_belongs_to_many :events Event.rb => has_to_and_belongs_to_many :users Events_Users迁移 => [user_id, event_id, id=>false]

所以我认为我应该这样做...

users_controller.rb =>

def add_event
@user = User.find(session[:user_id])
params[:user][:event_ids] ||= []
  if @user.update_attributes(params[:user])
      flash[:notice]='Added to My Events'
  redirect_to :action => "index"
      end  
 end

并且btn_link看起来像...
<% @events.each do |event| %>
<%= link_to image_tag("heart.gif"), :controller => 'user', :action => 'add_event' %>
<%=h event.name %>
<%=h event.description %>
<% end %>

但我不确定如何检查它是否正常工作...我应该如何在控制台中执行这些操作,以便可以检查记录是否被添加?

u = User.find(1)
e = Event.find(1)

如何创建一个变量 x 并将其赋值为 u.e 的值?

2个回答

5

试试这个:

u = User.find(1)
u.events << Event.find(1) # will add the Event object to the user events

u.events.last # will show the event added

太好了!但是你如何在控制器中添加<<操作,以便我可以在网页上执行该操作呢? - ChrisWesAllen
<<方法在控制器中也可以使用。u.event返回一个数组。实际上,您正在调用标准的数组操作。Rails覆盖了<<(也称为push)操作的标准行为,以更新association表。 - Harish Shetty

2
“但我不确定如何检查它是否正常工作。”
你可以在控制台中进行检查,但这并不能证明它总是有效的。它只能证明它在你的情况下有效。下次当你想测试一个简单的案例时,你应该再次去控制台。
相反地,你应该编写测试。例如:
def test_add_events_for_user
  u = users(:some_user)
  e1, e2 = events(:one), events(:two)
  post :add_event, user => {u.id, :event_ids => [e1.id, e2.id] }
  assert u.events.include?(e1)
  assert u.events.include?(e2)
end

当然,在你的测试中最好使用factory_girl + shoulda。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接