Il codice dovrebbe funzionare bene, dato che si dispone di un attributo user_id
sul Task
di agire come la chiave esterna, oppure è possibile specificare la chiave esterna in associazione a User
modello come segue:
class User < ActiveRecord::Base
has_many :tasks, foreign_key: "uid"
end
Ora il problema è, non è possibile utilizzare belongs_to
su ActiveResource
quindi, a meno che non sia necessario recuperare user
da un'istanza della classe Task
, è sufficiente rimuoverlo e l'altro lato della relazione funzionerà comunque, se è necessario recuperare il user
quindi si dovrebbe implementare il proprio metodo finder come segue:
class Task < ActiveResource::Base
schema do
string 'created_by' #email
# other fields
end
def user
@user ||= User.find self.user_id # use the attribute name that represents the foreign key
end
def user=(user)
@user = user
self.update_attribute(:user_id, user.id)
end
end
Questo sarà essenzialmente si comportano allo stesso come ci si aspetterebbe su un modello ActiveRecord
, tuttavia questo può essere faticoso se si dispone di più associazioni in modo da poter invece estendere il modulo di ActiveResource
aggiungere belongs_to
come segue :
module BelongsToActiveResource
def self.included(base)
base.extend(ClassMethods)
end
module ClassMethods
def belongs_to(name, options = {})
class_eval %(
def #{name}
@#{name} ||= name.to_s.classify.find(name.id)
end
def #{name}=(obj)
@#{name} ||= obj
self.update_attribute((name.to_s + "_id").to_sym, @#{name}.id
end
)
end
end
end
ActiveResource::Base.class_eval { include BelongsToActiveResource }
Questo vi permetterà di utilizzare belongs_to su qualsiasi modello ActiveResource
.
PS: la soluzione di cui sopra è stato ispirato da https://stackoverflow.com/a/8844932/3770684
Ho provato questo con la patch scimmia avete suggerito, ma quando mi allontano 'User.last.tasks' ottengo 'NoMethodError: metodo non definito 'relation_delegate_class' per l'attività: Classe ' – Simmo
Quali versioni di ruby e rail stai usando? – cousine
Rails 4.1.0 e Ruby 2.1.1 – Simmo