2016-10-26 52 views
0

我有如下數據關係:管理與Rails的相關車型陣營

NewsfeedItem.rb 
    has_many :comments 
    has_many :likes 

Like.rb 
    belongs_to :newsfeed_item 

Comment.rb 
    belongs_to :newsfeed_item 

在html.erb文件,管理這些關係很容易。例如:

# in newsfeed_items/index.hmtl.erb 
<% @newsfeed_items.each do |item| %> 
    <div> 

    <div> 
     <h2><%= item.title %></h2> 
     <p><%= item.content %></p> 
    </div> 

    <p>Likes: <%= item.likes.length %></p> 

    <ul> 
     <% item.comments.each do |comment| %> 
     <li><%= comment.text %></li> 
     <% end # comments.each %> 
    </ul> 

    </div> 
<% end # newsfeed_items.each%> 

不過,我有如何正確單獨的擔憂掙扎時,我想推斷到這個作出反應。當前newsfeed_items組件:

# in components/newsfeed_items.jsx 
var NewsfeedItems = React.createClass({ 
    getInitialState: function() { 
    return {items: []}; 
    }, 
    loadItems: function() { 
    $.ajax({ 
     url: this.props.url, 
     dataType: 'json', 
     type: 'GET', 
     success: function(data) { 
     this.setState({items: data}); 
     }.bind(this) 
    }); 
    }, 
    componentDidMount: function() { 
    this.loadItems(); 
    }, 
    render: function() { 
    var items = this.state.data.map(function(item) { 
     return (<NewsfeedItem key={item.id} title={item.title} content={item.content} /> 
    }); 
    return (
     <div className="c-newsfeed-list"> 
     {items} 
     </div> 
    ); 
    } 
}); 

這個組件從newsfeed_items_controller檢索項:

# in newsfeed_items_controller.rb 
def index 
    respond_to do |format| 
    format.html 
    format.json {render json: @newsfeed_items} 
    end 
end 

好像我會混合的擔憂,如果我附likesnewsfeed_items到JSON從返回的commentsnewsfeed_items_path。然而,爲每個newsfeed_item設置單獨的阿賈克斯呼叫以獲得其關聯likescomments似乎沒有必要。

哪個是最佳實踐/最佳解決方案?

回答

1

你是對的,多個API調用是不必要的。這裏有兩個備選方案我已經在生產中使用:

  1. JSON Builder Gem這使您可以通過API傳遞定製相關的對象與主對象一起
  2. 覆蓋模型中的as_json方法納入您的關聯對象。默認render json: @newsfeed_items調用@newsfeed_items.to_json所以通過覆蓋方法來包含它的關聯,你可以得到你想要的任何東西。
+0

想想我一定會去jBuilder路線。謝謝! – ReidasaurusRex