Ваш код должен работать нормально, учитывая, что у вас есть атрибут user_id
для Task
, который действует как внешний ключ, или вы можете указать внешний ключ в ассоциации для модели User
следующим образом:
class User < ActiveRecord::Base
has_many :tasks, foreign_key: "uid"
end
Теперь проблема в том, что вы не можете использовать belongs_to
для ActiveResource
, поэтому, если вам не нужно извлекать user
из экземпляра класса Task
, вы можете просто удалить его, и другая сторона отношения все еще будет работать, однако, если вам нужно чтобы получить user
, вам нужно будет либо реализовать свой собственный метод поиска следующим образом:
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
Это в основном будет вести себя так же, как вы ожидаете от модели ActiveRecord
, однако это может быть утомительно, если у вас есть несколько ассоциаций, поэтому вместо этого вы можете расширить модуль ActiveResource
, добавив belongs_to
следующим образом:
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 }
Это позволит вам использовать own_to на любой модели ActiveResource
.
PS: приведенное выше решение было вдохновлено https://stackoverflow.com/a/8844932/3770684
person
cousine
schedule
24.06.2014