Ruby on rails 不确定这段代码是如何读取的

Ruby on rails 不确定这段代码是如何读取的,ruby-on-rails,ruby,activerecord,ruby-on-rails-5,Ruby On Rails,Ruby,Activerecord,Ruby On Rails 5,我正在浏览github,查看一些很酷的代码,但不理解这些代码的作用: 我知道有2个属于关联,但我不明白“self.request”方法的含义和作用 另外,“事务”不是用于SQL数据库查询而不是ruby代码吗 有人能澄清一下吗 class Friendship < ActiveRecord::Base belongs_to :friend, :class_name => "User", :foreign_key => "friend_id" belongs_to :use

我正在浏览github,查看一些很酷的代码,但不理解这些代码的作用:

我知道有2个属于关联,但我不明白“self.request”方法的含义和作用

另外,“事务”不是用于SQL数据库查询而不是ruby代码吗

有人能澄清一下吗

class Friendship < ActiveRecord::Base
  belongs_to :friend, :class_name => "User", :foreign_key => "friend_id"
  belongs_to :user


   def self.request(user, friend)
      unless user == friend or Friendship.exists?(user, friend)
          transaction do
              create(:user => friend, :friend => user, :status => 'requested')
              create(:user => user, :friend => friend, :status => 'pending')
          end
      end
  end
类友谊“User”,:foreign\u key=>“friend\u id”
属于:用户
def自我请求(用户、朋友)
除非user==朋友或友谊。存在?(用户,朋友)
事务处理
创建(:user=>friend,:friend=>user,:status=>requested')
创建(:user=>user,:friend=>friend,:status=>pending')
结束
结束
结束

要回答您的两个问题:

  • self.request
    表示该方法是类方法。在类上调用它,如
    User.request(User\u a,User\u b)
    。而实例方法(定义时没有
    self
    )通常是在
    用户的特定实例上调用的实例方法
  • transaction
    用于在数据库事务中运行查询。请注意
    transaction
    块中的两个
    create
    方法调用。它们生成SQL插入

  • def self.request
    表示它是class方法,也就是说,你可以称它为
    Friendly.request(user1,user2)

    在其中,我们检查它是否不是同一个用户,或者友谊是否已经存在

    如果没有,我们将在
    frienships
    表中创建两条记录,包装在事务中。即,如果任何插入失败,则不会发生插入