0

我在 rails 3 应用程序中使用 mongoid 3。

我有一个带有引用对象“文件”的客户端类(因此是自定义“LocalisedFile”类的实例。)

客户端.rb:

class Client
    include Mongoid::Document
    include Mongoid::Timestamps
    store_in collection: 'clients'

    field :name, type: String

    has_many :files, class_name: 'LocalisedFile', inverse_of: :owner
end

本地化文件.rb:

class LocalisedFile
    include Mongoid::Document
    include Mongoid::Timestamps
    include Geocoder::Model::Mongoid
    store_in collection: 'files'

    belongs_to :owner, class_name: 'Client', inverse_of: :files
end

管理我的文件没问题。

但是当我想渲染一个文件数组时,我只得到一个带有客户端字符串 id 的“owner_id”字段......

[(2)
    {
        "_id": "508e85e412e86a2607000005",
        "created_at": "2012-10-29T13:34:29Z",
        "owner_id": "508c06e4bcd7ac4108000009",
        "title": "Try",
        "updated_at": "2012-10-29T13:34:29Z",
    },-
    {
        "_id": "508e8c5312e86a2607000006",
        "created_at": "2012-10-29T14:01:56Z",
        "owner_id": "508c06e4bcd7ac4108000009",
        "title": "2nd Try",
        "updated_at": "2012-10-29T14:01:56Z",
    }-
]

这可能很正常,但我想获取客户信息,以便在带有 Google Maps API 的 JS 应用程序中使用它,如下所示:

[(2)
    {
        "_id": "508e85e412e86a2607000005",
        "created_at": "2012-10-29T13:34:29Z",
        "owner": {
            "_id": "508c06e4bcd7ac4108000009",
            "name": "Client 1"
        },
        "title": "Try",
        "updated_at": "2012-10-29T13:34:29Z",
    },-
    {
        "_id": "508e8c5312e86a2607000006",
        "created_at": "2012-10-29T14:01:56Z",
        "owner": {
            "_id": "508c06e4bcd7ac4108000009",
            "name": "Client 1"
        },
        "title": "2nd Try",
        "updated_at": "2012-10-29T14:01:56Z",
    }-
]

有人有想法吗?我想测试类似 to_hash 方法的东西,但它不起作用......

4

1 回答 1

1

由于您使用 和 之间的引用关系ClientLocalisedFile因此客户端的数据不会在文件对象中复制,只有owner_id, 才能使关系正常工作。您需要通过您在模型owner上定义的关系来访问客户端数据。LocalisedFile例如:

l = LocalisedFile.first
l.owner.id # returns the id of the owner
l.owner.name # returns the name of the owner

要创建您需要的那种输出,我建议将其抽象为一个实例方法,例如:

class LocalisedFile
  def as_hash_with_owner
    hash = self.to_hash
    hash[:owner] = { _id: self.owner.id, name: self.owner.name }
    hash.except[:owner_id]
  end
end

然后您可以执行以下操作:

files = LocalisedFile.all.entries # or whatever criteria
files.map { |f| f.as_hash_with_owner }

这应该为您提供一个 ruby​​ 哈希数组,然后您可以将其转换为 JSON 或您需要的任何格式。

于 2012-10-30T03:23:55.103 回答