访问和编辑rails中的相关数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了访问和编辑rails中的相关数据相关的知识,希望对你有一定的参考价值。

我有两个表,一个叫做事件,另一个是会话。可以有多个具有相同session_name的事件,但每个事件只有一个session_name

enter image description here

class Session < ApplicationRecord
  belongs_to :event, foreign_key: 'session_id'
end
class Event < ApplicationRecord
  has_one :session
end

我不完全确定如何设置belongs_to和has_one。我已经尝试过查看教程和其他示例,但它们与我所拥有的有些不同。

在form_for事件中,如何在找到或创建新session_name的地方获取它,session_id获取正确的id

在我的控制器中,我尝试将其用于编辑表单,但这只显示事件的ID而不是会话

 def edit
   @events = Event.find(params[:format])
   @session = @events.session.id
 end

我知道这是很多任何帮助或指示将被非常占用,我已经试图包围我的头,我不是最好的数据库和activerecord。我赞赏任何批评只是不要成为一个混蛋。

UPDATE

我得到了编辑和新表单以显示但如何将其保存/更新到数据库。这是我的表格。用户将填写的会话表中唯一的字段是session_name。当他们点击保存/更新时,我需要事件表来查找或创建sessions.id并将其插入events.session_id。

<%= form_for @session,html:{ class:'form-horizontal', style:'color:white;margin:auto;'}, url: signup_path do |s| %>
  <%= s.fields_for :event do |e| %>

    <label class="col-form-label">Event:</label>
    <%= e.select(:eventname, [['Pink Ribbon Invite'],['2018 Missouri State Championship - KC']],{ :include_blank => false }, class: 'form-control')%>

      <label class="col-form-label">First Name:</label>
      <%= e.text_field(:firstname, class: 'form-control') %>
        <label class="col-form-label">Last Name: </label>
        <%= e.text_field(:lastname, class: 'form-control') %>

          <label class="col-form-label">Phone Number: </label>
          <%= e.telephone_field(:phone, class: 'form-control') %>
            <label class="col-form-label">Email: </label>
            <%= e.email_field(:email, class: 'form-control') %>

              <label class="col-form-label">Street Address:</label>
              <%= e.text_field(:streetaddress1, class: 'form-control') %>

                <label class="col-form-label">Street Address 2: </label>
                <%= e.text_field(:streetaddress2, class: 'form-control') %>

                  <label class="col-form-label">City:</label>
                  <%= e.text_field(:city, class: 'form-control') %>

                    <label class="col-form-label">State: </label>
                    <%= e.text_field(:state, class: 'form-control') %>

                      <label class="col-form-label">Zip:</label>
                      <%= e.text_field(:zip, class: 'form-control') %>

                        <label class="col-form-label">Gymnast</label>
                        <%= e.text_field(:gymnast, class: 'form-control') %>

                          <label class="col-form-label">Team Gym</label>
                          <%= e.text_field(:gym, class: 'form-control') %>

                            <label class="col-form-label">Session</label>
                            <%= s.text_field(:session_name, class: 'form-control') %>

                              <label class="col-form-label">Level</label>
                              <%= e.text_field(:level, class: 'form-control') %>

                                <label class="col-form-label">Product</label>
                                <%= e.select(:product, [["Digital - $80"],["Flash Drive - $100"],["Team Registration - $650"]], {} ,class: 'form-control') %>

                                  <%= e.check_box(:terms, class:'') %>
                                    <%= link_to 'Terms and Conditions', '#', data:{target: '#termsmodal', toggle: 'modal'}%>
                                      <% end %>
                                        <div>
                                          <%= s.submit 'Sign Up', class:'btn btn-primary' %>
                                        </div>
                                        <% end %>
 def new
   @session = Session.new()
   @session.build_event
 end

 def create
   @session = Session.find_or_create_by(session_name: 
   params[:session_name])
   @event = @session               #This is where i'm confused
    @event.new(session_params)
    if @session.save
     flash[:success] = "You have successfully signed up"
    redirect_to signup_path
   else
    render 'signup'
     end
 end

 def edit
   @events = Event.find(params[:format])
   @session = Session.find(@events.session_id)
 end

 def update
   puts params.inspect

  @events = Event.find(params[:event][:id])
  if @events.update_attributes(event_params)
   redirect_to event_path
 else
  render 'edit'
  end
end
答案

首先,你有错误的联想。模型与reference(在你的情况下session_id)总是belongs_to的东西。所以你应该在belongs_to :session中使用Event,在has_one :event中使用Session。要构建正确的表单,您应该使用嵌套属性。你可以看看Here的例子。一般来说,形式应该是这样的。

<%= form_for(@session) do |f| %>
...
<%= f.fields_for :event do |builder| %>
  <%= builder.label :some_field, "Some field" %><br />
  <%= builder.text_field :some_field %><br />
  ...
<% end %>
...

<% end %>

别忘了在accepts_nested_attributes_for :event中添加Session

以上是关于访问和编辑rails中的相关数据的主要内容,如果未能解决你的问题,请参考以下文章

如何使控制台中的视图缓存片段过期?

Rail片段缓存如何使您的应用受益,即阻止数据库调用?

如何正确关联rails中的对象而不为相关性制作单独的表

Rails 应用程序中的动态角色和权限系统

Rails:旧数据与新数据不匹配时如何更新片段缓存

如何打开rails控制台以访问rails 6中的多个数据库?