2013-11-02 52 views
2

,在一個鐵軌模型使用的代碼:什麼<<在Ruby on Rails的模型

self.groups << Group.find_by_name("User") 

這是什麼< <?
有沒有關於它的文件?

+4

第一LO確定在'self.groups'的*類型*。然後去找那種類型的文檔。例如,如果'self.groups'是一個數組,那麼請參閱['Array#<<'](http://www.ruby-doc.org/core-1.9.3/Array.html#method-i- 3C-3C)。由於Ruby中的運算符只是方法*,因此此搜索策略適用於任何類型/運算符配對。 – user2864740

+0

本質上它是一種方法,意味着將某物附加到某物上。在ruby中,您可以將項目追加到數組中,將對象添加到對象集合中,將方法追加到類實例中。您可以搜索<< here:http://www.ruby-doc.org/core-2.0.0/ – trh

回答

3

不要誤會。在OP的問題中,<<而不是的一種方法Array。相反,這是一種方法ActiveRecord::Associations::CollectionProxy

源這裏

def <<(*records) 
    proxy_association.concat(records) && self 
    end 
    alias_method :push, :<< 
    alias_method :append, :<< 

https://github.com/rails/rails/blob/b15ce4a006756a0b6cacfb9593d88c9a7dfd8eb0/activerecord/lib/active_record/associations/collection_proxy.rb#L944代碼(代碼爲導軌4,而在導軌3它的工作原理是相同的)

該方法對於其中HAS_MANY其他對象的對象。其他對象的集合可以用這個方法來添加新的關聯對象,關聯ID自動分配和新對象得到了保存到數據庫

class Question < ActiveRecord::Base 
    has_many :answers 

question = Question.last # id: 100 
question.answers.size # 0 
question.answers << Answer.new(body: 'demo answer') 

question.answers.size # 1 

Answer.last # id: 1, question_id: 100, body: 'demo answer' 
# Note here, the contacted answer got saved in db. 

您還可以使用它的工作原理相同的別名方法:

question.answers.push Answer.new(body: 'demo answer') 
question.answers.append Answer.new(body: 'demo answer') 
0

使用此方法,如果self.groups是數組,則可以將元素推送到數組中。

0

<<是一個根據基類數組和字符串來連接在串的情況下,對象以任何陣列或字符串(.to_s方法必須在鄰來限定定義的紅寶石「追加」運算符bject)。

任何Ruby運算符都可以在Ruby中重載。任何Ruby運算符都可以在任何自定義類中使用,就像任何其他命名方法一樣。

In Rails ActiveRecord ::關聯<<運算符被定義爲將記錄追加到關聯中。 (請參閱底部的參考)

在您的特定示例中,<<運算符會將找到的記錄追加到「組」關聯中。如果沒有找到記錄,則不會追加任何記錄。

下面是如何在一類過載(或限定)<<一個例子:

class Array 
    def <<(arg) 
     puts arg.inspect 
    end 
    end 

    [] << 'something awful' 
    => 'something awful' 

參見:

Ruby Array << operator

Ruby String << operator

Rails ActiveRecord::Associations::ClassMethods << operator