为什么要为此模型创建连接记录?

时间:2018-01-02 19:22:56

标签: ruby-on-rails ruby ruby-on-rails-4

这是一个网络应用程序,用于在我们启动更新或改进时安排我们公司在Scrum团队的开发人员和产品所有者之间的各种站点部署。我有两个模型UserReleaseRelease是单个部署事件。然后我有一个名为release_users的联接表。用户拥有并属于许多版本。版本有许多用户,名称为product_owners,属于一个用户,名称为developerRelease表格的developer_id列等于用户的ID,因此它根本不涉及ReleaseUser关联(至少,'}是我想要的。)

问题在于:当我创建新的Release记录(通过表单)时,除了产品所有者之外,它还会自动为开发人员创建/保存ReleaseUser记录。当我查看@release.product_owners时,我看到那里的开发人员不应该出现。它应该只为产品所有者创建ReleaseUser记录。 @release.developer按预期工作,它会根据developer_id从用户表中选择用户,并且不会通过ReleaseUser表。

我觉得我的模型配置有问题吗? Rails正在执行一些我无法精确定位的幕后魔术。

代码

release.rb:

class Release < ActiveRecord::Base
  has_many :release_users, dependent: :destroy
  has_many :product_owners, :through => :release_users, :source => :user
  belongs_to :developer, :class_name => "User"
end

user.rb:

class User < ActiveRecord::Base
  has_many :release_users, dependent: :destroy
  has_many :releases, :through => :release_users
end

release_user.rb:

class ReleaseUser < ActiveRecord::Base
  belongs_to :release
  belongs_to :user
end

_form.html.erb:

<div class="field">
  <%= f.label "Developer" %><br>
  <%= f.select :developer_id, options_for_select(User.select_options, selected: @release.selected_option), { include_blank: 'None' } %>
</div>

<div class="field">
  <%= f.label "Product Owners" %><br>
  <%= f.collection_check_boxes :product_owner_ids, User.all, :id, :full_name do |b| %>
    <label class="checkbox">
      <%= b.check_box %> <%= b.label %> <br/>
    </label>
  <% end %>
</div>

releases_controller.rb:

# POST /releases
# POST /releases.json
def create
  @release = Release.new(release_params)

  # Release belongs to one developer at most
  unless release_params[:developer_id].empty?
    @developer = User.find(release_params[:developer_id])

    # User has many releases, add to array
    @developer.releases << @release
    @developer.save
  end

  respond_to do |format|
    if @release.save
      format.html { redirect_to releases_url, notice: 'Release was successfully created.' }
      format.json { render :show, status: :created, location: @release }
    else
      format.html { render :new }
      format.json { render json: @release.errors, status: :unprocessable_entity }
    end
  end
end

(Rails 4)

2 个答案:

答案 0 :(得分:2)

这一行:

@developer.releases << @release

正在向ReleaseUsers添加记录,因为您声明:

class User 
   has_many :releases, :through => :release_users
end

因此,使用@developer.releases << @release告诉rails在release_users表中创建该关联。

您似乎需要在developer_releases上隔离User之类的内容,然后才需要unless块。

这样的东西
class User
  # existing relationships
  has_many :developer_releases, class_name: 'Release', foreign_key: :developer_id
end

然后可以缩小控制器代码:

def create
  @release = Release.new(release_params)
  respond_to do |format|
    if @release.save
      format.html { redirect_to releases_url, notice: 'Release was successfully created.' }
      format.json { render :show, status: :created, location: @release }
    else
      format.html { render :new }
      format.json { render json: @release.errors, status: :unprocessable_entity }
    end
  end
end

答案 1 :(得分:0)

这是创建连接表

result.txt

没有理由这样做。把它拿出来吧。