在 Rails 中 has_one 和 properties_to 之间的区别是什么?

我试图了解 has_one在 RoR 中的关系。

假设我有两个模型—— PersonCell:

class Person < ActiveRecord::Base
has_one :cell
end


class Cell < ActiveRecord::Base
belongs_to :person
end

我可以在 Cell模型中用 has_one :person代替 belongs_to :person吗?

不是一样吗?

51734 次浏览

同时使用这两种方法可以从 Person 和 Cell 模型中获取信息。

@cell.person.whatever_info and @person.cell.whatever_info.

如果你加上“ properties _ to”,那么你就得到了一个双向关联。这意味着你可以得到一个人从细胞和细胞的人。

没有真正的区别,两种方法(包含和不包含“ properties _ to”)使用相同的数据库模式(cell 数据库表中的 person _ id 字段)。

总结一下: 除非需要模型之间的双向关联,否则不要添加“ properties _ To”。

不,它们不是可以互换的,而且它们之间有一些真正的区别。

belongs_to表示该类的外键在表中。所以 belongs_to只能进入持有外键的类。

has_one意味着在另一个表中有一个引用此类的外键。因此,has_one只能进入由另一个表中的列引用的类中。

所以这是错误的:

class Person < ActiveRecord::Base
has_one :cell # the cell table has a person_id
end


class Cell < ActiveRecord::Base
has_one :person # the person table has a cell_id
end

这也是错误的:

class Person < ActiveRecord::Base
belongs_to :cell # the person table has a cell_id
end


class Cell < ActiveRecord::Base
belongs_to :person # the cell table has a person_id
end

正确的方法是(如果 Cell包含 person_id字段) :

class Person < ActiveRecord::Base
has_one :cell # the person table does not have 'joining' info
end


class Cell < ActiveRecord::Base
belongs_to :person # the cell table has a person_id
end

对于一个双向联系,你需要每一个,他们必须去在正确的类。即使是单向关联,使用哪种关联也很重要。