2017-02-10 6 views
1

그래서 많은 관계가있는 계약 모델과 사용자 모델이 있습니다. 계약은 내가이가 내 양식이여러 모델에 속한 belongs_to 양식의 마지막 ID 만 업데이트

Contract.find(params[:id]).creator.email 
Contract.find(params[:id]).leader.email 
Contract.find(params[:id]).buyer.email 
Contract.find(params[:id]).seller.email 

User.find(params[:id]).contracts 

을 할 수 있도록 여러 사용자에게 있지만, 다른 ID가 속한, 그래서 나는 이미 생성 된 사용자

<%= simple_form_for(@contract) do |f| %> 
 
    <% if @contract.errors.any? %> 
 
     <div id="error_explanation"> 
 
      <h3><%= pluralize(@contract.errors.count, 'error') %> prohibited this contract from being saved:</h3> 
 

 
      <ul> 
 
      <% @contract.errors.full_messages.each do |message| %> 
 
       <li><%= message %></li> 
 
      <% end %> 
 
      </ul> 
 
     </div> 
 
    <% end %> 
 

 
    <div class="form-group"> 
 
     <%= f.label :creator_id %><br> 
 
     <%= f.select(:creator_id, User.all.map { |c| [c.email, c.id] }) %> 
 
    </div> 
 

 
    <div class="form-group"> 
 
     <%= f.label :leader_id %><br> 
 
     <%= f.select(:leader_id, User.all.map { |c| [c.email, c.id] }) %> 
 
    </div> 
 

 
    <div class="form-group"> 
 
     <%= f.label :buyer_id %><br> 
 
     <%= f.select(:buyer_id, User.all.map { |c| [c.email, c.id] }) %> 
 
    </div> 
 

 
    <div class="form-group"> 
 
     <%= f.label :seller_id %><br> 
 
     <%= f.select(:seller_id, User.all.map { |c| [c.email, c.id] }) %> 
 
    </div> 
 
    
 
<% end %>

각 ID를 설정할 수 있습니다

각 계약서가 올바르게 설정되었지만 계약서를 확인할 때 사용자가 판매자 인 경우 동일한 계약서 만 찾을 수 있습니다 (양식의 마지막 div)

편집 : 여기 내 두 모델이 있습니다.

class User < ApplicationRecord 
    devise :database_authenticatable, :registerable, 
      :recoverable, :rememberable, :trackable, :validatable 

    has_many :contract, :foreign_key => 'creator_id' 
    has_many :contract, :foreign_key => 'leader_id' 
    has_many :contract, :foreign_key => 'buyer_id' 
    has_many :contract, :foreign_key => 'seller_id' 

    validates :email, presence: true, uniqueness: true 
    validates :role, presence: true 
end 

class Contract < ApplicationRecord 
    belongs_to :creator, :class_name => 'User', :foreign_key => 'creator_id' 
    belongs_to :leader, :class_name => 'User', :foreign_key => 'leader_id' 
    belongs_to :buyer, :class_name => 'User', :foreign_key => 'buyer_id' 
    belongs_to :seller, :class_name => 'User', :foreign_key => 'seller_id' 
end 

계약 컨트롤러 :

class ContractsController < ApplicationController 
    before_action :set_contract, only: [:show, :edit, :update, :destroy] 

    def index 
    @contracts = Contract.all 
    end 

    def show 
    @contract = Contract.find(params[:id]) 
    end 

    def new 
    @contract = Contract.new 
    end 

    def edit 
    end 

    def create 
    @contract = Contract.new(contract_params) 
    if @contract.save 
     redirect_to contracts_path, notice: 'Le contract a été créé avec succès' 
    else 
     render :new 
    end 
    end 

    def update 
    if @contract.update(contract_params) 
     redirect_to contract_path 
    else 
     render :edit 
    end 
    end 

    def destroy 
    @contract.destroy 
    redirect_to contracts_path 
    end 

    private 
    def set_contract 
     @contract = Contract.find(params[:id]) 
    end 

    def contract_params 
     params.require(:contract).permit(:creator_id, 
             :leader_id, 
             :buyer_id, 
             :seller_id) 
    end 
end 

내가 선택한 사용자 만 마지막 하나가 작동을 업데이트 셀렉터의 각이 필요하고 나는 그것이 작동하는 방법을 알아낼 수 없습니다.

나는이 접근법이 작동 할 수 있다고 생각하지만 나는 레일스에서 ​​새로 왔고 아마도 잘못된 방법을 사용하고 있습니다. '복잡한 형태를 구축'에 여기 http://guides.rubyonrails.org/form_helpers.html 설명하지만 난

현장에 대한 희망을 설정할 때 나는 분명 해요 형태로 각 특정 사용자 사이의 구별을 잃은 것처럼 나는 사용자를 생성, 간단한 has_and_belongs_to_many 관계를 시도 충분 해, 고마워!

+1

모델 정의도 삭제할 수 있습니까? –

+0

방금 ​​질문을 편집했습니다 – LRP

+0

제안이 효과가 있었는지 알려주세요. has_many와 함께 복수형을 사용하지 않으면 매우 궁금합니다. –

답변

0

좋아, 모델 정의에 몇 가지 문제점이 있습니다.

  1. 의 관계는 has_many를 사용하는 경우 복수 할 필요가, 그래서 has_many :contracts을 수 있습니다. 이것은 아마도 당신의 문제를 일으키는 원인 일 것입니다.
  2. 같은 테이블에 외래 키가 여러 개있는 것은 좋지 않습니다. 대신 has_many :contracts, foreign_key: 'contractor_id'이 하나 있어야합니다. 그런 다음 별도의 변수를 사용하여 User의 역할을 정의하십시오. 그리고 Contract에는 belongs_to :user, :foreign_key => 'contractor_id'이 표시됩니다. 그런 다음 creator, leader 등을 호출하려는 경우 custom accessor_methods를 지정할 수 있습니다.
+0

계약은 내 코드에서 복수형이었고, 쉬운 용어로 여기에 다시 쓸 때 계약이 잘못되었습니다. 나는 당신이 role과 accessor_methods에 대한 변수로 무엇을 제안하는지 이해하지만 계약과 사용자간에 많은 관계를 유지할 필요가있다. 내 계약에는 항상 4 명의 사용자가 연관되어 있습니다. – LRP

+0

더 이상 ID가없는 경우 내보기가 어떻게 작동해야하는지 잘 모르겠습니다. 이 모든 것을 어떻게 구현해야하는지에 대한 더 자세한 내용을 알려주시겠습니까? – LRP

+0

여러분의 경우에 대한 완벽한 솔루션을 작성하려면 컨트롤러와 전체보기를 추가해야 더 좋은 그림을 얻을 수 있습니다. 이 문제에 대해 다시 생각해 보면 has_and_belongs_to_many가 필요하다고 생각합니다. 따라서 사용자를 구분할 수있는 방법을 찾지 못했다면 문제가 없어졌습니다. –