在 rails 模型中使用的代码:
self.groups << Group.find_by_name("User")
这是什么<<?
有没有关于它的文件?
不要误会。对于 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(代码适用于 Rails 4,在 Rails 3 中工作方式相同)
此方法适用于具有_许多其他对象的对象。其他对象的集合可以使用此方法添加新的关联对象,自动分配关联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')
使用此方法,您可以将元素推送到数组中(如果self.groups
是数组)。
<<
是为基类 Array 和 String 定义的 Ruby 'append' 运算符,用于将对象连接到任何 Array 或 String(如果是字符串,则.to_s
必须在对象上定义方法)。
任何 Ruby 运算符都可以在 Ruby 中重载。并且任何 Ruby 运算符也可以在任何自定义类中使用,就像任何其他命名方法一样。
在 Rails ActiveRecord::Associations 中,<<
操作符被定义为将记录附加到关联中。(见底部参考)
在您的特定示例中,<<
操作员将找到的记录附加到“组”关联中。如果没有找到记录,则不附加任何内容。
这是一个关于如何<<
在类中重载(或定义)的示例:
class Array
def <<(arg)
puts arg.inspect
end
end
[] << 'something awful'
=> 'something awful'
也可以看看: