JJD*_*JJD 5 database-relations associations nested-forms ruby-on-rails-3
我无法弄清楚如何设置一个创建新的表单,Study同时还创建相关的StudySubject和Facility.的user_id,facility_id并且study_subject_id必须是可用于创建Study对象,你可以在数据库中关系模型看.

这是迁移的studies.其他表不包含外键.
def self.up
create_table :studies do |t|
t.references :user
t.references :facility
t.references :subject
t.date "from"
t.date "till"
t.timestamps
end
add_index :studies, ["user_id", "facility_id", "subject_id"], :unique => true
end
Run Code Online (Sandbox Code Playgroud)
模型定义了以下关联.
# user.rb
has_many :studies
# subject.rb
has_many :studies
# facility.rb
has_many :studies
# study
belongs_to :user
belongs_to :subject
belongs_to :facility
Run Code Online (Sandbox Code Playgroud)
问题
1)has_many和belongs_to定义是否正确?
2)如何study使用accepts_nested_attributes_for创建一个?
3)研究应该只属于一个用户.我是否需要将其添加user_id到每个其他对象中以存储关联?
自从2周的广泛学习以来,我对Rails全新.对不起,也许是一个愚蠢的问题.
是的。有用。一位好朋友提供了帮助。这就是我们设置的。
请注意我同时重命名StudySubject为。Subject
该模型 study.rb
belongs_to :student, :class_name => "User", :foreign_key => "user_id"
belongs_to :subject
belongs_to :university, :class_name => "Facility", :foreign_key => "facility_id"
accepts_nested_attributes_for :subject, :university
Run Code Online (Sandbox Code Playgroud)
控制器 studies_controller.rb
def new
@study = Study.new
@study.subject = Subject.new
@study.university = Facility.new
end
def create
@study = Study.new(params[:study])
@study.student = current_user
if @study.save
flash[:notice] = "Successfully created study."
redirect_to(:action => 'index')
else
render('new')
end
end
Run Code Online (Sandbox Code Playgroud)
我使用devise进行身份验证,使用cancan进行授权。这就是current_user控制器中可用的原因。
新的研究观点 new.html.erb
<%= form_for @study, :url => { :action => "create" } do |f| %>
<table summary="Study form fields">
<%= render :partial => "shared/study_form_fields", :locals => { :f => f } %>
<%= f.fields_for :subject do |builder| %>
<%= render :partial => "shared/subject_form_fields", :locals => { :f => builder } %>
<% end %>
<%= f.fields_for :university do |builder| %>
<%= render :partial => "shared/facility_form_fields", :locals => { :f => builder } %>
<% end %>
</table>
<p><%= f.submit "Submit" %></p>
<% end %>
Run Code Online (Sandbox Code Playgroud)
我希望这能为您节省一些时间。我花了很多时间来了解如何设置。
| 归档时间: |
|
| 查看次数: |
4267 次 |
| 最近记录: |