> For the complete documentation index, see [llms.txt](https://kelby.gitbook.io/rails-beginner-s-guide/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://kelby.gitbook.io/rails-beginner-s-guide/activerecord_association_achitecture/4_methods/method_has_one.md).

# has\_one

## 方法本身表示什么意思。

指定一对一关系。如果，"前者 has\_one 后者"，那么'后者'需要包括'前者\_id'属性。

## 引进了哪些方法，表示什么意思。

...

这里的解释参考了 `belongs_to`，不单它们的方法名是一样的。定们定义方法就也是一样的。

另，belongs\_to 和 has\_one 都属于 Singular Association.

## 有什么参数，表示什么意思，使用后有什么效果。

普通参数 **Scope**

设置一个 scope，通过前者查询后者的时候(其它时候不影响)，自动加到查询语句里。(类似在后者 model 里定义了一个 default\_scope，但只有通过前者查询才起作用)

举例:

```ruby
has_one :author, -> { where(comment_id: 1) }
has_one :employer, -> { joins(:company) }
has_one :dob, ->(dob) { where("Date.new(2000, 01, 01) > ?", dob) }
```

## 其它

使用 primary\_key 前后对比：

```ruby
book has_one :author

book.author
# 传递的值是 book.id
# => Author Load (6.5ms) SELECT `authors`.* FROM `authors` \n
                         WHERE `authors`.`book_id` = book.id LIMIT 1

book has_one :author, primary_key: :a_primary_id

book.author
# 传递的值是 book.a_primary_id
# => Author Load (6.5ms) SELECT `authors`.* FROM `authors` \n
                         WHERE `authors`.`book_id` = book.a_primary_id LIMIT 1
```
