Rails:包含在方法中

时间:2011-07-29 13:53:54

标签: ruby-on-rails-3

有标准

def mutual_friends(friend)
  self.friends & friend.friends
end

尝试:include => :profile

可以这样做吗?

如果没有,有人可以用这个范围版本来帮助我吗?

鉴于用户有:

has_one  :profile, :dependent => :destroy    
has_many :friendships, :dependent => :destroy
has_many :friends, 
         :through => :friendships,
         :conditions => "status = 'accepted'" 

1 个答案:

答案 0 :(得分:0)

要回答您的问题,有两种方法可以做到这一点。 Rails的方式 1)创建一个模块(在你的libs文件夹中)将共享方法添加到该模块,并将模块包含在需要的类中。

OO方式 2)创建一个来自ActiveRecord :: Base的基类,使其成为一个抽象类以避免STI并将常用方法添加到基类中,然后从该类中下载朋友和友谊

选项1示例 朋友模特

#You might need to require the friends module for Rails 3
require 'friends'
include Friends
class Friend < ActiveRecord::Base
#...
end

在配置文件模型和需要此功能的任何其他类中执行相同操作 Friends模块在lib文件夹中名为friends.rb的文件

module Friends
    module ClassMethods
      #put your class methods here e.g.
      def self.some_class_method
      end
    end

    #put you instance methods here e.g.
    def another_method
    end

 #  extend host class with class methods when we're included
    def self.included(host_class)
      host_class.extend(ClassMethods)
    end

end

选项2示例 模型文件夹中的base_friends.rb(如果您愿意,可以使用或者lib)

class BaseFriends < ActiveRecord::Base
  self.abstract_class = true
  #All you usual methods that you want to share in the usual model way here
end

朋友模特 再次 - 只需在配置文件和任何其他需要此功能的模型中执行相同的操作

class Friend < BaseFriends
  #...
end

我更喜欢选项2 - 将所有文件放在同一个位置(模型文件夹)更清晰,它更直观(您已经熟悉模型层中的工作)这就是Ruby的全部内容(OO)当你想要Rails不允许的多重继承时,选项1更适合。

这回答了你的问题,但我认为你的问题是错误的 你不会通过一种方法来做到这一点。没有必要,也没有意义。上面的任何一种方法都允许你分享常用的方法加上朋友和友谊通常会在同一个表中工作,因此你只需要将class_name和foreign_key声明添加到你的has_many友谊和belongs_to朋友声明中就是同一个类。