2010-04-28 22 views
6

Tôi có một số mô hình Ares (xem dưới đây) mà tôi đang cố gắng để sử dụng liên kết với (mà dường như được hoàn toàn không có cơ sở và có lẽ không thể nhưng tôi nghĩ rằng tôi muốn cung cấp cho nó một thử)Rails ActiveResource

Vì vậy, bên cạnh dịch vụ của tôi, đối tượng ActiveRecord tôi sẽ làm một cái gì đó giống như

render :xml => @group.to_xml(:include => :customers) 

(thấy xml được tạo dưới đây)

Các mô hình Group và Khách hàng là HABTM

Trên mặt ARes của tôi, tôi hy vọng rằng nó có thể thấy thuộc tính x2 <customers> xml và tự động điền thuộc tính .customers của đối tượng Nhóm đó, nhưng phương thức has_many etc không được hỗ trợ (ít nhất là theo tôi có thể biết)

Vì vậy, tôi tự hỏi làm thế nào ARes hiện nó phản ánh trên XML để thiết lập các thuộc tính của một đối tượng. Trong AR ví dụ tôi có thể tạo ra một def customers=(customer_array) và đặt nó bản thân mình, nhưng điều này dường như không làm việc trong ARES.

Một gợi ý tôi tìm thấy cho một "hiệp hội" là chỉ có một phương pháp

def customers 
    Customer.find(:all, :conditions => {:group_id => self.id}) 
end 

Nhưng điều này có những bất lợi mà nó làm cho một cuộc gọi dịch vụ thứ hai để tìm kiếm những khách hàng ... không mát

Tôi muốn mô hình ActiveResource của mình thấy rằng thuộc tính của khách hàng trong XML và tự động điền vào mô hình của tôi. Ai có kinh nghiệm với cái này rồi nào??

# 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> 

Trả lời

16

ActiveResource không hỗ trợ liên kết. Nhưng nó không ngăn cản bạn thiết lập/nhận dữ liệu phức tạp đến/từ một đối tượng ActiveResource. Dưới đây là cách tôi sẽ thực hiện nó:

mô hình Server side

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 

Server side GroupsController

def show 
    @group = Group.find(params[:id]) 
    respond_to do |format| 
    format.xml { render :xml => @group.to_xml(:include => :customers) } 
    end  
end 

khách hàng mô hình bên

class Customer < ActiveResource::Base 
end 

class Group < ActiveResource::Base 
end 

Khách hàng bên 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 

Khách hàng xem: Truy cập vào khách hàng từ đối tượng Group

# access customers using attributes method. 
@group.customers.each do |customer| 
    # access customer fields. 
end 

phía Chủ đầu tư: Xây khách hàng để đối tượng Group

group.attributes['customers'] ||= [] # Initialize customer array. 
group.customers << Customer.build 
Các vấn đề liên quan