2015-08-18 527 views
2

Rails的has_one在哪個級別上運行?has_one究竟做了什麼?

實施例:

class User 
    has_one :comment 
end 

class Comment 
    belongs_to :user 
end 

我打開與形式創建註釋瀏覽器兩個選項卡(user_idcurrent_user.id剖切),輸入數據,點擊保存在每個標籤。

現在我有兩個有效的意見user_id

我相信,在Comment模型中添加uniqueness: true用戶存在審定會做預防保存多個註釋以相同user_id的工作:

validates :user, 
    presence: true, 
    uniqueness: true 

但是,什麼是has_one負責呢?

+1

現在,如果你做'user.comment'你會得到一個評論回來,而不是兩個。這就是它的作用。 –

+0

是的,沒有太多的.. –

回答

5

是嗎?這:

# File activerecord/lib/active_record/associations.rb, line 1405 
    def has_one(name, scope = nil, options = {}) 
    reflection = Builder::HasOne.build(self, name, scope, options) 
    Reflection.add_reflection self, name, reflection 
    end 

來源:

https://github.com/rails/docrails/blob/master/activerecord/lib/active_record/associations.rb#L1405

http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_one

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

+0

對不起,我無法拒絕,或使它適合評論... –

+2

有一個「正是這個」+1。一個人應該小心他們的問題的措辭:) –

+2

值得一提的是'獨特性:true'不會在db級別執行,所以它容易受到「競爭條件」的影響。 –

5

has_one允許您使用user.comment查詢與用戶關聯的第一條評論,該評論將評估類似於select * from comments where comments.user_id == USER_ID limit 1的SQL。在這種情況下,您可能正在尋找has_many,它會返回多個評論。

但是,它並不強制每個用戶只有一條評論。如果您確實只希望每個用戶有一條評論,則應該將user_id設置爲註釋上的唯一列,並在數據庫級別執行(不適用uniqueness: true)。