2014-11-07 2 views
1

Вчера я был сумасшедшим, потому что не мог выполнять проверки в модели, используя отношения many-to-many на ActiveRecord on Rails 4.1.6.ActiveRecord, могу ли я проверить ассоциацию has_and_belongs_to?

Я попытался использовать этот драгоценный камень: gem 'deferred_associations', предложенный: this blog , но не преуспел.

Итак, я убил чувства MVC ... Я сделал проверку в контроллере ...:/ Но на данный момент я изменил отношение и бизнес-логику моего приложения. Но вопрос все еще остается у меня.

Может кто-нибудь объяснить мне, насколько валидаты на has_and_belongs_to_many отношение возможно?

С уважением!

UPDATE 01 к @ User089247

 # My logic is simple: A question should has 3 or less answers. 
    # A answer can be used in many questions. 


    validates_associated :answers, if: :has_more_space? 

     private 
     def has_more_space? 
     if answers.size > 3 
      true 
     else 
      errors.add(:answers, "You can't do that!") 
      false 
     end 
     end 

ответ

0

Спасибо за все, что вам попытаться помочь мне, но со временем я прочитал documentation, и я обнаружил эту часть:

вы должны использовать has_many: через если вам нужны валидации, обратные вызовы, или экс tra при модели соединения.

Другими словами, я пытался сделать не ту форму!

На данный момент я знаю, если вам не нужно ничего проверять или использовать, используйте has_and_belong_to_many, потому что это проще и проще в использовании!

Спасибо!

1

Я думаю, что вы пропустили, чтобы увидеть validates_associated метод в Active Record Validations guide.

Вот пример:

class Book < ActiveRecord::Base 
    has_and_belongs_to_many :authors 

    validates_associated :authors 
end 

Убедитесь, что вы:

Не используйте validates_associated на обоих концах ваших ассоциаций. Они могли бы звонить друг другу в бесконечном цикле.

Поскольку вы не точно проверяете наличие ассоциации, validates_associated не будет работать в вашем случае. validates_associated проверяет присутствие ассоциации. Для проверки счетчика ассоциаций ваша модель может иметь, вам придется создать пользовательскую проверку, как это:

validate :maximum_answers 

private 
def maximum_answers 
    errors.add(:base, "You can't add more than 3 answers.") if self.reload.answers.count >= 3 
end 
+0

Я этого не нашел! : /. Вы использовали один раз? Какие-то разные методы для создания собственных валидаций? –

+0

Прошу прощения, я тебя не понял. Вы использовали один раз ?: * Да, и он работает. * Некоторые разные методы для создания собственных валидаций ?: * Нет, это как раз то, как я упомянул в примере.* – Surya

+0

Потому что я хочу проверить (используя ваш пример), например. : Разрешить добавление нового автора ТОЛЬКО с регистрами в таблице отношений 'books_authors' составляет 3 или меньше. –

1

Похоже, вам нужен пользовательской проверки

#in Author class 

validate :must_have_3_books_or_less 

def must_have_3_books_or_less 
    if self.books_authors.size > 3 
    self.errors.add_to_base("Author is required to have 3 books or less") 
    end 
end 
+0

это тоже не работает: / –

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