在has_many中使用集合<< object function:通过关系时,如何获取中间对象?

在定义了has_many:through关系后,

@user = User.New(:name=>"Bob") @project = Project.New( :name=>"Market Survey") @user.projects << @project 

有没有一种简单的方法来获取它创建的新中间对象? 例如在上面的例子中,如果中间表是“成员资格”,那么我可以使用:

 @membership = @user.projects << @project 

我有这种感觉,必须有一种比我们一直做的更好的方法,即

 @membership = Membership.where(:user_id=>x , :project_id=>y).first 

我所知道的并没有“神奇”的做法。 如果你正在寻找比你迄今为止所做的更好的东西,那么我能想到的最好的事情就是这样做:

 class User < ActiveRecord::Base # ... other active record stuff here. def membership_for(project) memberships.where(:project_id => project.id).first end end # Somewhere else... @user = User.new(:name=>"Bob") @project = Project.new(:name=>"Market Survey") @user.projects << @project @user.save! membership = @user.membership_for(@project) 

不完美,并且需要额外的代码,但它确实比您当前的代码读取更好,并且在Ruby中很重要。

你可以这样做:

 @membership = @user.members.find_by_project_id(@project.id) 

不确定它是否比你做的更容易/更好。

我不确定我是否理解你的问题,如果一个用户有很多项目,我想你可以使用这个:

 @user = User.create(:name=>"Bob") # Create project and membership with user_id of @user same time, return project. @project = @user.projects.create(:name=>"Market Survey") 

如果你想找到会员资格,我认为还有另一种方式:

 @membership = Membership.find(:first, conditions: { user_id: x, project_id: y })