如何在使用集合时获取中间对象<

时间:2012-11-13 22:30:42

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

定义了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

3 个答案:

答案 0 :(得分:3)

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

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中很重要。

答案 1 :(得分:0)

您可以执行以下操作:

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

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

答案 2 :(得分:0)

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

@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 })