代码之家  ›  专栏  ›  技术社区  ›  stellard

红宝石上的铁轨。如何使用活动记录。A:中的生成方法属于关系?

  •  124
  • stellard  · 技术社区  · 15 年前

    我在rails中找不到有关.build方法的任何文档(我当前使用的是2.0.2)。

    通过实验,您似乎可以使用构建方法将记录添加到 has_many 任何记录保存前的关系。

    例如:

    class Dog < ActiveRecord::Base
      has_many :tags
      belongs_to :person
    end
    
    class Person < ActiveRecord::Base
      has_many :dogs
    end
    
    # rails c
    d = Dog.new
    d.tags.build(:number => "123456")
    d.save # => true
    

    这将正确地保存狗和带有外键的标签。这似乎不适用于 belongs_to 关系。

    d = Dog.new
    d.person.build # => nil object on nil.build
    

    我也试过了

    d = Dog.new
    d.person = Person.new
    d.save # => true
    

    中的外键 Dog 在这种情况下,由于在保存时,新用户没有ID,因为它尚未保存,因此未设置。

    我的问题是:

    1. 构建是如何工作的,这样Rails就足够聪明,能够找出如何以正确的顺序保存记录?

    2. 我怎样才能在 归属于 关系?

    3. 在哪里可以找到关于这个方法的任何文档?

    谢谢你

    2 回复  |  直到 9 年前
        1
  •  143
  •   mahemoff    11 年前

    如有记录:

    从API文档中 Module ActiveRecord::Associations::ClassMethods

    collection.build(属性=,) 返回的一个或多个新对象 集合类型 用属性和 通过 外键,但还没有 保存的。注意:只有当 关联的对象已存在,而不是 如果是零!

    在相反的方向构建的答案是稍微改变语法。以狗为例,

    Class Dog
       has_many :tags
       belongs_to :person
    end
    
    Class Person
      has_many :dogs
    end
    
    d = Dog.new
    d.build_person(:attributes => "go", :here => "like normal")
    

    甚至

    t = Tag.new
    t.build_dog(:name => "Rover", :breed => "Maltese")
    

    您还可以使用create_dog立即保存它(很像您可以调用集合的相应“create”方法)。

    Rails如何足够智能?这是魔法(或者更准确地说,我只是不知道,我很想知道!)

        2
  •  44
  •   nehpets    14 年前
    @article = user.articles.build(:title => "MainTitle")
    @article.save