복붙노트

[RUBY-ON-RAILS] has_many에 레코드를 추가하는 방법 : 레일에 협회를 통해

RUBY-ON-RAILS

has_many에 레코드를 추가하는 방법 : 레일에 협회를 통해

class Agents << ActiveRecord::Base
  belongs_to :customer
  belongs_to :house
end

class Customer << ActiveRecord::Base
  has_many :agents
  has_many :houses, through: :agents
end

class House << ActiveRecord::Base
  has_many :agents
  has_many :customers, through: :agents
end

어떻게 고객을위한 에이전트 모델에 추가하는 방법은 무엇입니까?

이 최선의 방법인가?

Customer.find(1).agents.create(customer_id: 1, house_id: 1)

콘솔에서 위의 작품 벌금 그러나, 나는 실제 응용 프로그램에서이를 달성하는 방법을 모르겠어요.

형태도 입력으로 house_id 걸리는 고객 가득 상상해보십시오. 그럼 난 내 컨트롤러에 다음을해야합니까?

def create 
  @customer = Customer.new(params[:customer])
  @customer.agents.create(customer_id: @customer.id, house_id: params[:house_id])
  @customer.save
end

테이블을 통해 : 전반적으로 나는 has_many에서 레코드를 추가하는 방법을 혼동하고있어?

해결법

  1. ==============================

    1.난 당신이 단순히이 작업을 수행 할 수 있다고 생각합니다 :

    난 당신이 단순히이 작업을 수행 할 수 있다고 생각합니다 :

     @cust = Customer.new(params[:customer])
     @cust.houses << House.find(params[:house_id])
    

    아니면 고객을 위해 새로운 집을 만들 때 :

     @cust = Customer.new(params[:customer])
     @cust.houses.create(params[:house])
    

    또한 IDS를 통해 추가 할 수 있습니다 :

    @cust.house_ids << House.find(params[:house_id])
    
  2. ==============================

    2.'가장 좋은 방법은'필요에 따라 무엇을 가장 편안하게 느낀다. 혼란의 차이에서 새로운 생성 방법과 << 연산자의 액티브의 행동을 온다.

    '가장 좋은 방법은'필요에 따라 무엇을 가장 편안하게 느낀다. 혼란의 차이에서 새로운 생성 방법과 << 연산자의 액티브의 행동을 온다.

    새로운 당신을 위해 연관 레코드를 추가하지 않습니다. 당신은 하우스를 구축해야하고 에이전트는 자신을 기록합니다

    house = @cust.houses.new(params[:house])
    house.save
    agent = Agent(customer_id: @cust.id, house_id: house.id)
    agent.save
    

    이 두 경우 모두에서 에이전트 레코드를 생성해야하기 때문에 @ cust.houses.new 및 House.new 효과적으로 동일합니다.

    미샤 언급, 당신은 또한 컬렉션에 << 연산자를 사용할 수 있습니다. 이것은 단지 당신이 집 모델을 구축해야한다, 당신을 위해 에이전트 모델을 구축 할 것입니다 :

    house = House.create(params[:house])
    @cust.houses << house
    agent = @cust.houses.find(house.id)
    

    당신을 위해 모두 하우스와 에이전트 기록을 구축 할 것입니다 만들지 만, 당신이 당신의보기 또는 API에 그를 반환하려는 경우에는 에이전트 모델을 찾아야합니다 :

    house = @cust.houses.create(params[:house])
    agent = @cust.agents.where(house: house.id).first
    

    당신이 강타 사업자 대신 집 사용을 만들 때 예외가 발생되도록하려면 최종 참고로, (예를 들어, 새로운! 만들고!).

  3. ==============================

    3.연결을 추가하는 또 다른 방법은 외래 키 열을 사용하는 것입니다 :

    연결을 추가하는 또 다른 방법은 외래 키 열을 사용하는 것입니다 :

    agent = Agent.new(...)
    agent.house = House.find(...)
    agent.customer = Customer.find(...)
    agent.save
    

    또는 대신 레코드의 관련 레코드의 ID를 전달 정확한 열 이름을 사용합니다.

    agent.house_id = house.id
    agent.customer_id = customer.id
    
  4. from https://stackoverflow.com/questions/7297338/how-to-add-records-to-has-many-through-association-in-rails by cc-by-sa and MIT license