Rails ActiveResource Ассоциации
У меня есть некоторые модели ARes (см. Ниже), с которыми я пытаюсь использовать ассоциации (которые кажутся полностью недокументированными и, возможно, не возможными, но я решил попробовать)
Так что на моей стороне обслуживания, мой объект ActiveRecord будет отображать что-то вроде
render :xml => @group.to_xml(:include => :customers)
(см. сгенерированный XML ниже)
Группа моделей и клиенты HABTM
С моей стороны, я надеюсь, что он может увидеть <customers>
атрибут XML и автоматически заполнить .customers
атрибут этого объекта Group, но методы has_many и т. д. не поддерживаются (по крайней мере, насколько я могу судить)
Поэтому мне интересно, как ARes отражает XML, чтобы установить атрибуты объекта. В AR, например, я мог бы создать def customers=(customer_array)
и установить его сам, но это не работает в ARes.
Одно предложение, которое я нашел для "ассоциации", это просто есть метод
def customers
Customer.find(:all, :conditions => {:group_id => self.id})
end
Но у этого есть недостаток в том, что он делает второй вызов в службу поддержки для поиска этих клиентов... не круто
Я хотел бы, чтобы моя модель ActiveResource видела, что клиенты атрибутируют в XML, и автоматически заполняет мою модель. У кого-нибудь есть опыт работы с этим??
# My Services
class Customer < ActiveRecord::Base
has_and_belongs_to_many :groups
end
class Group < ActiveRecord::Base
has_and_belongs_to_many :customer
end
# My ActiveResource accessors
class Customer < ActiveResource::Base; end
class Group < ActiveResource::Base; end
# XML from /groups/:id?customers=true
<group>
<domain>some.domain.com</domain>
<id type="integer">266</id>
<name>Some Name</name>
<customers type="array">
<customer>
<active type="boolean">true</active>
<id type="integer">1</id>
<name>Some Name</name>
</customer>
<customer>
<active type="boolean" nil="true"></active>
<id type="integer">306</id>
<name>Some Other Name</name>
</customer>
</customers>
</group>
1 ответ
ActiveResource не поддерживает ассоциации. Но это не мешает вам устанавливать / получать сложные данные в / из объекта ActiveResource. Вот как я бы это реализовал:
Модель на стороне сервера
class Customer < ActiveRecord::Base
has_and_belongs_to_many :groups
accepts_nested_attributes_for :groups
end
class Group < ActiveRecord::Base
has_and_belongs_to_many :customers
accepts_nested_attributes_for :customers
end
Серверная часть GroupsController
def show
@group = Group.find(params[:id])
respond_to do |format|
format.xml { render :xml => @group.to_xml(:include => :customers) }
end
end
Модель на стороне клиента
class Customer < ActiveResource::Base
end
class Group < ActiveResource::Base
end
Клиентская группа GroupsController
def edit
@group = Group.find(params[:id])
end
def update
@group = Group.find(params[:id])
if @group.load(params[:group]).save
else
end
end
Вид клиента: доступ к клиенту из объекта группы
# access customers using attributes method.
@group.customers.each do |customer|
# access customer fields.
end
Сторона клиента: установка клиента для объекта группы
group.attributes['customers'] ||= [] # Initialize customer array.
group.customers << Customer.build