2013-11-26 95 views
0

我有这些代码段(我刚学的回报率顺便说一句,所以请把它容易对我来说,我做了一些谷歌搜索已;)):红宝石(on Rails的)协会

class CreateMicroposts < ActiveRecord::Migration 
    def change 
    create_table :microposts do |t| 
     t.string :content 
     t.integer :user_id 

     t.timestamps 
    end 

    add_index :microposts, [:user_id, :created_at] 
    end 
end 

class Micropost < ActiveRecord::Base 
    belongs_to :user 
    validates :user_id, presence: true 
end 

这一个:

class User < ActiveRecord::Base 
    has_many :microposts 
    end 

没有什么困难的事情在这里。我都明白了。有一件事我不明白,虽然是这句话(关于迈克尔·哈特尔的教程,我读):

一旦我们定义适当的协会,@micropost 变量导致将自动已经user_id说明等于其关联的用户。

现在Rails如何做到这一点,为什么这会自动完成?任何解释这一点的努力都将不胜感激。

+0

抱歉,但是这不是问这种问题的正确的地方。你可以在Ruby on Rails论坛上提问。 – jvnill

+0

本教程应该解释这一点(或者更好的是,Rails的书实际上是深入解释的)。 [Rails指南也很好地覆盖了它](http://guides.rubyonrails.org/association_basics.html)。 –

回答

1

Rails是关于“约定优于配置”的想法,如果您按照一定数量的规则进行游戏,那么Rails可以为您处理很多事情。当你说“用户有许多Microposts并且Micropost属于每个模型中的用户时,Rails自动知道Microposts表中的user_id字段指向用户模型中的id字段,并且User表中的micropost_id字段指向在微柱相关的ID字段然后你可以这样做:

@ user.microposts把所有该用户 @ micropost.user中微型柱,以获得microspost的用户

对于这个“。魔术“的工作,你需要在模型本身中声明”拥有许多“和”属于“参数,并正确命名键为”user_id“和micropost_id,否则它将不起作用。

+0

所以你试图说,在创建模型时,如果我创建'usr_ids'而不是'user_id',那么它将无法工作。这意味着Rails会查找“user”和“id”这两个词吗? – Emanuel

+0

是的,这就是它如何知道这两个人是属于对方的。命名也很重要。 User.microposts和Micropost.users是有区别的。复数是关系的“许多”,单数是“一个”。 – fatfrog

+0

非常感谢。我不知道Rails如何“自动”知道这一点。 – Emanuel