Rails 4 oracle增强了适配器,可将许多传播数据传播到数据透视表

时间:2013-11-02 11:53:36

标签: ruby-on-rails oracle ruby-on-rails-4 legacy-database

首先要做的事情

使用:

  • rails4
  • oracle增强适配器rails4分支

我在现有数据库上映射了多对多的关系。 我的模型看起来像这样:

class EventMap < ActiveRecord::Base
  self.table_name="TAKE_PART"
  self.primary_key="id"
  belongs_to :event, foreign_key: "lottery_event_id"  
  belongs_to :entrant, foreign_key: "address_id"  
end

class Event < ActiveRecord::Base
  self.table_name="THE_EVENT"
  self.primary_key="id"
  has_many :event_maps, :foreign_key => "lottery_event_id"
  has_many :entrants, :through => :event_maps
  accepts_nested_attributes_for :entrants, :reject_if => :all_blank
end

class Entrant < ActiveRecord::Base
  self.table_name="ADDRESSES"
  self.primary_key="id"
  self.set_date_columns :date_of_birth
  has_many :events, :through => :event_maps
  has_many :event_maps, :foreign_key  => "address_id"
end

我投票页面的静态页面控制器

...
def vote
  @event=Event.find_by(id: 4227)
  @entrants=@event.entrants
  @entrant=@event.entrants.build
end
...

投票观点:

<%= form_for(@event) do |f| %>

  <%= f.fields_for :entrant do |builder| %>
    <%= render "/entrants/fields", :f => builder %>
  <% end %>

<div class="actions">
  <%= f.submit %>
</div>  
<% end %>

进入/字段部分:

<% if @entrant.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@entrant.errors.count, "error") %> prohibited this entrant from being saved:</h2>    
      <ul>
      <% @entrant.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>
  <%= f.hidden_field :id %>
  <div class="field">
    <%= f.label :lastname %><br>
    <%= f.text_field :lastname %>
  </div>
  <div class="field">
    <%= f.label :firstname %><br>
    <%= f.text_field :firstname %>
  </div>
  <div class="field">
    <%= f.label :street %><br>
    <%= f.text_field :street %>
  </div>
  <div class="field">
    <%= f.label :country_id %><br>
    <%= f.number_field :country_id %>
  </div>
  <div class="field">
    <%= f.label :city %><br>
    <%= f.text_field :city %>
  </div>
  <div class="field">
    <%= f.label :telephone %><br>
    <%= f.text_field :telephone %>
  </div>
  <div class="field">
    <%= f.label :email %><br>
    <%= f.text_field :email %>
  </div>
  <div class="field">
    <%= f.label :date_of_birth %><br>
    <%= f.date_select :date_of_birth %>
  </div>
  <div class="field">
    <%= f.label :lang_id %><br>
    <%= f.text_field :lang_id %>
  </div>
  <div class="field">
    <%= f.label :added %><br>
    <%= f.date_select :added %>
  </div>
  <div class="field">
    <%= f.label :salut %><br>
    <%= f.text_field :salut %>
  </div>
  <div class="field">
    <%= f.label :zip %><br>
    <%= f.text_field :zip %>
  </div>
  <div class="field">
    <%= f.label :newsletter %><br>
    <%= f.check_box :newsletter %>
  </div>
  <div class="field">
    <%= f.label :company %><br>
    <%= f.text_field :company %>
  </div>

表单现在提交给事件控制器PATCH

class EventsController < ApplicationController
  before_action :set_event, only: [:show, :edit, :update, :destroy]
  ...
  # PATCH/PUT /events/1
  # --> HOW DO I SAVE THE SUBMITTED ENTRANT HERE??? <--
  def update
    respond_to do |format|      
      if @event.update(event_params)
        format.html { redirect_to @event, notice: 'Event was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render action: 'edit' }
        format.json { render json: @event.errors, status: :unprocessable_entity }
      end
    end
  end
...
  private
    # Use callbacks to share common setup or constraints between actions.
    def set_event
      @event = Event.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def event_params
      params.require(:event).permit(:id, :lottery_id, :events_dates_id, :event_date, :event_location, :tickets_for_winner, :prize, :tickets_internally,
        :entrants_attributes => [:id, :lastname, :firstname, :street, :country_id, :city, :telephone, :email, :date_of_birth, :lang_id, :added, :salut, :zip, :newsletter, :company])
    end
end

如何使用Entrant注册Event,仅将数据添加到中间模型EventMap,因为Event将始终存在?

我是否需要在模型中包含accepts_nested_attributes_for来传播表格中的更改(我无法弄清楚文档中的内容)?我是否需要通过Entrant表单发送其他参数来更新EventMap

主要目标:我想要一个参赛者可以注册现有活动的表格!

2 个答案:

答案 0 :(得分:1)

很难判断你的表格,因为我们没有看到;)

但是你能够从嵌套属性创建嵌套属性是正确的,你需要设置accepts_nested_attributes_for :some_model, :some_other_model

如果您发现文档令人困惑,请参阅Railscasts: http://railscasts.com/episodes/196-nested-model-form-part-1 http://railscasts.com/episodes/197-nested-model-form-part-2

答案 1 :(得分:0)

您需要自定义逻辑并且必须定义自定义逻辑,Rails不会自动更新所有内容,必须按照您的建议在更新控制器中定义。

我可能会按照以下方式做点什么:

def update

    entrant = Entrant.find(params[:entrant_id])
    event = Event.find(params[:event_id])

    EventMap.create!(event: event, entrant: entrant)
    #.... go on with usual stuff

    # Alternatively you could use build
    event_map = EventMap.new
    event_map.build(event: event, entrant: entrant)

end