has_many: attraverso interruzioni su find_or_initialize_by
-
05-07-2019 - |
Domanda
Ho un modello, Feed, che ha e appartiene a molti utenti filtrati. In questo caso l'ho implementato attraverso una relazione has_many: through.
class Feed < ActiveRecord::Base
has_many :denials, :dependent => :destroy
has_many :filtered_users, :through => :denials
Vorrei creare un record se non esiste o trovare l'oggetto se esiste. Quando provo ad usare find_or_initialize_by (o find_or_create_by) viene generata un'eccezione che dice undefined method 'feed_id=' for <FilteredUser..
Ecco il codice:
feed = Feed.find(params[:id])
user = feed.filtered_users.find_or_initialize_by_user_url(params[:user_url])
if params[:status] == "block"
feed.filtered_users << user
else
feed.filtered_users.delete(user)
end
feed.save
Qualche suggerimento su come risolvere questo problema o su come aggirarlo SECCO?
Grazie!
Soluzione
Innanzitutto, poiché è una relazione has_many :through
, l'inizializzazione non ha modo di sapere a quale denial
il nuovo filtered_user
dovrebbe essere associato. Se si desidera utilizzare find_or_initialize_by
, è necessario eseguirlo su un feed
specifico associato a <=>.
Crea un nuovo filtered_user e associalo a un rifiuto specifico.
Secondo, concordando con ErsatzRyan, la logica generale sembra un po 'off.
Altri suggerimenti
Non sarebbe più facile controllare prima i parametri [: status] e poi fare ciò che devi fare?
feed = Feed.find(params[:id])
if params[:status] == 'block'
feed.filtered_users.build(:user_url => params[:user_url])
else
feed.filtered_users.find_by_user_url(params[:user_url]).delete
end
feed.save
avviso di codifica aerea non testata