这是一个网络应用程序,用于在我们启动更新或改进时安排我们公司在Scrum团队的开发人员和产品所有者之间的各种站点部署。我有两个模型User
和Release
。 Release
是单个部署事件。然后我有一个名为release_users
的联接表。用户拥有并属于许多版本。版本有许多用户,名称为product_owners
,属于一个用户,名称为developer
。 Release
表格的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)
答案 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
没有理由这样做。把它拿出来吧。