2

在 rails 模型中使用的代码:

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

这是什么<<?
有没有关于它的文件?

4

3 回答 3

3

不要误会。对于 OP 的问题<<不是. 相反,它是一种方法。ArrayActiveRecord::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')
于 2013-11-02T20:45:04.253 回答
0

使用此方法,您可以将元素推送到数组中(如果self.groups是数组)。

于 2013-11-02T19:30:09.613 回答
0

<<是为基类 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'

也可以看看:

Ruby 数组<<运算符

Ruby 字符串<<运算符

Rails ActiveRecord::Associations::ClassMethods<<运算符

于 2013-11-02T20:57:32.070 回答