0

Я чувствую себя немного глупым, чтобы спросить об этом, но я был Googling мой * # выключен.Rails has_many через проверку получил пропущен

Ну у меня есть следующие модели:

class Company < ActiveRecord::Base 
    has_many :employments 
    has_many :users, through: :employments 

    validates_presence_of :name 
    validates_presence_of :description 
    validates_numericality_of :zip, only_integer: true 
    validates_presence_of :email 
    validates_presence_of :street 
    validates_presence_of :city 
    validates_presence_of :country 
    validates_presence_of :telephone 
end 

class Employment < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :company 
end 

class User < ActiveRecord::Base 
    has_many :employments 
    has_many :companies, through: :employments 
end 

Важных здесь является компания-модель, которая имеет некоторые валидации.

Теперь у меня есть следующий контроллер, чтобы создать новую компанию:

class CompaniesController < ApplicationController 
    def create 
    @company = Company.new(company_params) # The params were set with a private Method 
    @employment = @company.employments.build(user: current_user, is_admin: true) 
    if @employment.save 
     redirect_to :back, flash: { success: 'Success' } 
    else 
     @title = 'Create a new company' 
     render :new 
    end 
    end 
end 

Проблема заключается в том, что, когда я оставляю компании-поля пустым, компания получает не создана, но занятость Модель получает persistet в базе данных.

Я верю, что это как-то связано с Company.new() - Звонок, который я должен проверить, если первая компания @ Model создана, прежде чем будет создана модель занятости @.

Как я могу добиться того, что проверка сначала проверяется?

спасибо!

+1

В дополнение к ответу vinodadhikary вы также можете попробовать сохранить компанию. поэтому вместо '@ employment.save' используйте' @ company.save'. Это также должно сохранять '@ занятость', когда' @ company' проходит проверки. – jvnill

+0

Он работает! Большое спасибо! – pmuens

ответ

2

Для проверки соответствующего объекта вам необходимо использовать validates_associated. Обратите внимание на «Предупреждение» и «Примечание» в связанном документе api.

Try:

class Employment < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :company 

    validates_associated :company 
end 
+0

Спасибо! Еще одно отличное решение! – pmuens

1

в дополнение к ответу vinodadhikary, вы также можете попробовать сохранить компанию. поэтому вместо @employment.save используйте @company.save. Это также должно сохранить @employment, когда @company проходит проверки.

Смежные вопросы