0

我正在为一个 REST API 开发一个 Ruby 绑定,并且正在为它的一部分而被认为是惯用的 Ruby 苦苦挣扎。

用一个简化的例子来说明,API 所代表的资源形成了一个树形结构:

           root
            /\
           /  \
          /    \
      group   group    
        /       /\
       /       /  \
      /       /    \
project  project  project

要创建子的新实例,需要了解其父实例。例如,要创建一个新组,它必须知道根,以便它可以检索用于从根创建组的 URI。

我对读取访问感到相当满意:

api = Api.new(...)
api.groups # An array of all groups
api.groups.select(...).projects # An array of all a group's projects

它正在创造我不确定的新资源。

我考虑过在数组子类上有一个 create 方法:

group = api.groups.create("group-name")
project = group.projects.create("project-name")

直接实例化类型,将父级作为构造函数参数:

group = Group.new(api, "project-name")
project = Project.new(group, "project-name")

在父对象上创建方法:

group = api.create_group("group-name")
project = group.create_project("project-name")

在上面的三种方法中,我更喜欢第一种,因为它简洁并且允许链接创建。第三个选项类似,但感觉不对 - 就 REST API 而言,创建发生在错误的级别,因为它是允许创建组的组资源。也就是说,我不是一个经验丰富的 Ruby 开发人员,首先,我希望 Ruby API 对 Ruby 开发人员来说是惯用的,即使这意味着它与 REST API 的模型不完全匹配。

4

1 回答 1

0

我不清楚提供的代码示例和描述如何与 REST 关联,但我会根据我的理解提供两分钱:

我认为将这三者结合使用是完全有效的。至于什么是惯用的,我会从Rails 关联方法中获得提示。

api.groups.create遵循 Rails 的has_many语法。api.create_groupgroup.create_project遵循has_one语法。而且我假设,在create/的语法糖之下create_association,您正在使用组合来将所有类的引用联系在一起,因此Group.new(api, "group-name")/Project.new(group, "project-name")似乎也是完全有效的选项。没有规则说您不能使用所有三种方法来获得良好的效果(Rails 确实如此)。

我建议避免子类化 Ruby 的基类(你提到子类化 Array),除非你有充分的理由这样做。只需在必要时使用组合来委托给他们。

于 2012-05-09T13:56:15.040 回答