2016-11-14 83 views
0

我有一個#as_json包括不叫as_json在assoc命令

User(id, name, something_secret, created_at, updated_at) 

Company(id, name, something_secret, created_at, updated_at) 

型號:

class Company 
    def as_json(options = {}) 
    opts = { 
     only: [:id, :name] 
    }.merge(options) 
    super(opts) 
    end 
end 

class User 
    def as_json(options = {}) 
    opts = { 
     only: [:id, :name], 
     includes: [:company] 
    }.merge(options) 
    super(opts) 
    end 
end 

如果我打電話company.as_json,那麼一切都很好,我得到:

{ 
    id: 1, 
    name: "Name" 
} 

但是,如果我叫user.as_json,那麼它包括所有的公司的東西

{ 
    id: 1, 
    name: "Jim", 
    company: { 
    id: 1, 
    name: "Name", 
    something_secret: "super secret", 
    created_at: "2016-11-12 13:03:07", 
    updated_at: "2016-11-12 13:03:07" 
    } 
} 

這似乎應該呼籲公司#as_json,但事實並非如此。爲什麼不呢?我怎樣才能做到這一點?

感謝

+0

我同意,現在看來似乎應該是遞歸的,因爲'to_json'是遞歸調用,但它被認爲是不好的形式來調用或重寫此方法。如果你發現自己經常這樣做,我會看看演示者。 ['draper'](https://github.com/drapergem/draper)gem使其變得簡單,並且表現形式非常模塊化 – engineersmnky

回答

0

您可以使用only來限制User模型內includes訪問相關Company屬性如下:

class User 
    def as_json(options = {}) 
    opts = { 
     only: [:id, :name], 
     includes: {company: {only: [:id, :name]}} 
    }.merge(options) 
    super(opts) 
    end 
end 
+1

這對我來說似乎很臭。如果我將公司納入多個地方,那麼我必須在任何地方添加/更改它?看起來很奇怪Ruby/Rails不會自動調用它。我想我可以爲公司添加一個PUBLIC_ATTRIBUTES常量,然後在用戶模型中包含:{company:{only:Company :: PUBLIC_ATTRIBUTES}}''' –

+0

@PeterR是的,你可以這樣做。 – dp7