w projekcie Ruby on Rails Próbuję uzyskać dostęp do obiektów skojarzenia w ActiveRecord przed zapisaniem wszystkiego w bazie danych.Ruby on Rails has_many through obiektów asocjacyjnych przed zapisaniem
class Purchase < ActiveRecord::Base
has_many :purchase_items, dependent: :destroy
has_many :items, through: :purchase_items
validate :item_validation
def item_ids=(ids)
ids.each do |item_id|
purchase_items.build(item_id: item_id)
end
end
private
def item_validation
items.each do |item|
## Lookup something with the item
if item.check_something
errors.add :base, "Error message"
end
end
end
end
Jeśli buduję mój obiekt tak: purchase = Purchase.new(item_ids: [1, 2, 3])
i spróbuj go zapisać metodę item_validation
nie posiada jeszcze zbieranie przedmiotów zaludnione, więc mimo, że pozycje zostały ustawione zestaw nie dostać szansę na wywołanie metody check_something
na dowolnym z nich.
Czy można uzyskać dostęp do kolekcji przedmiotów, zanim mój model zakupu i modele asocjacji zostaną utrwalone, aby można było przeprowadzić walidację z nimi?
Jeśli mogę zmienić metodę item_validation
być:
def item_validation
purchase_items.each do |purchase_item|
item = purchase_item.item
## Lookup something with the item
if item.something
errors.add :base, "Error message"
end
end
end
wydaje się działać tak, jak ma to jednak trudno mi uwierzyć, że nie ma sposobu, aby uzyskać bezpośredni dostęp do kolekcji elementów z szyny przed moim zakupem i powiązane zapisy są zapisywane w bazie danych.