[ruby-on-rails] Rails find_or_create da più di un attributo?


Answers

Per chiunque altro si imbatta in questo thread ma deve trovare o creare un oggetto con attributi che potrebbero cambiare in base alle circostanze, aggiungere il seguente metodo al modello:

# Return the first object which matches the attributes hash
# - or -
# Create new object with the given attributes
#
def self.find_or_create(attributes)
  Model.where(attributes).first || Model.create(attributes)
end

Suggerimento per l'ottimizzazione: indipendentemente dalla soluzione scelta, prendere in considerazione l'aggiunta di indici per gli attributi che si richiedono più frequentemente.

Question

C'è un utile attributo dinamico nel record attivo chiamato find_or_create_by:

Model.find_or_create_by_<attribute>(:<attribute> => "")

Ma cosa succede se ho bisogno di find_or_create per più di un attributo?

Supponiamo che abbia un modello per gestire una relazione M: M tra Group e Member chiamata GroupMember. Potrei avere molti casi in cui member_id = 4, ma non voglio mai più di una istanza dove member_id = 4 e group_id = 7. Sto cercando di capire se è possibile fare qualcosa del genere:

GroupMember.find_or_create(:member_id => 4, :group_id => 7)

Mi rendo conto che potrebbero esserci modi migliori per gestirlo, ma mi piace la convenienza dell'idea di find_or_create.




Passando un blocco a find_or_create , è possibile passare ulteriori parametri che verranno aggiunti all'oggetto se viene creato nuovo. Questo è utile se stai convalidando la presenza di un campo che non stai cercando.

assumendo:

class GroupMember < ActiveRecord::Base
    validates_presence_of :name
end

poi

GroupMember.where(:member_id => 4, :group_id => 7).first_or_create { |gm| gm.name = "John Doe" }

creerà un nuovo GroupMember con il nome "John Doe" se non ne trova uno con member_id 4 and group_id 7




Links