首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络技术 > 网络基础 >

Rails 本身的many to many关系 self has_many

2012-10-08 
Rails 自身的many to many关系 self has_many简单点的#注意外键在person上people: id name whatever-you

Rails 自身的many to many关系 self has_many
简单点的

#注意外键在person上people: id; name; whatever-you-need friendships: id; person_id; friend_idclass Person < ActiveRecord::Base   has_many :friendships, :foreign_key => "person_id",       :class_name => "Friendship"   has_many :friends, :through => :friendshipsendclass Friendship < ActiveRecord::Base   belongs_to :person, :foreign_key => "person_id", :class_name => "Person"   belongs_to :friend, :foreign_key => "friend_id", :class_name => "Person"  end


稍微不同的一个版本
ActiveRecord::Schema.define(:version => 20100410040453) do  create_table "people", :force => true do |t|    t.string   "name"    t.string   "sex"    t.integer  "father_id"    t.integer  "mother_id"    t.datetime "created_at"    t.datetime "updated_at"  endend



#这里就要看source的应用,是用来关联belongs_to的class Person < ActiveRecord::Base  self.inheritance_column = "sex"  belongs_to :father, :class_name => "Person"  belongs_to :mother, :class_name => "Person"endclass Male < Person  has_many :children, :class_name => "Person", :foreign_key => :father_id  has_many :babymommas, :through => :children, :source => :mother, :uniq => trueendclass Female < Person  has_many :children, :class_name => "Person", :foreign_key => :mother_id  has_many :babydaddies, :through => :children, :source => :father, :uniq => trueend




自身referential而且,还有两个名字,例如tiwtter你的follower, 叫friend
create_table :users do |t|  t.column :login, :string, :null => falseendcreate_table :relationships, :id => false do |t|  t.column "user_id",  :integer, :null => false  t.column "buddy_id", :integer, :null => falseend


Spec测试部分
describe User do  before :each do    %w(u v w).each do |x|      eval "@#{x} = User.new; @#{x}.login = '#{x}'; @#{x}.save"    end  end  it "can be linked with another user" do    @u.linked_to << @v    @u.linked_to.should include(@v)    u2 = User.find_by_id @u.id    u2.linked_to.should include(@v)  end  it "can find users that linked to it" do    @u.linked_to << @v    @v.linked_from.should include(@u)  end  it "can see friends of its friends" do    @u.linked_to << @v    @v.linked_to << @w    @u.linked_to[0].linked_to.should include(@w)    @w.linked_from[0].linked_from.should include(@u)  end  it "has a list of all users linked to and from it" do    @u.linked_to << @v    @v.linked_to << @w    @v.linked.should include(@u)    @v.linked.should include(@w)  endend


Model设置
class Relationship < ActiveRecord::Base  belongs_to :user,    :class_name => 'User', :foreign_key => 'user_id'  belongs_to :buddy,    :class_name => 'User', :foreign_key => 'buddy_id'endclass User < ActiveRecord::Base  has_many :relations_to,    :foreign_key => 'user_id',  :class_name => 'Relationship'  has_many :relations_from,    :foreign_key => 'buddy_id', :class_name => 'Relationship'                               has_many :linked_to,    :through => :relations_to,   :source => :buddy  has_many :linked_from,    :through => :relations_from, :source => :userend



  select user_id, buddy_id    from relationships  union  select buddy_id, user_id     from relationshipsdef linked  User.find_by_sql "    select *    from users    where id in (      select buddy_id      from buddies      where user_id = #{id})"end

热点排行
Bad Request.