Ruby on rails rails模型之间的几个关联

Ruby on rails rails模型之间的几个关联,ruby-on-rails,ruby,postgresql,ruby-on-rails-4,Ruby On Rails,Ruby,Postgresql,Ruby On Rails 4,我正在努力定义rails 4.2.4中的一些关系。目前,我有以下几点: class Artist has_many :artist_members, dependent: :destroy end class ArtistMember < ActiveRecord::Base belongs_to :artist end 我也在为迁移而挣扎,在这方面的任何帮助都是受欢迎的。您想要实现的是一种自我参照的多对多关系 作为起点,您可以尝试以下解决方案: 模型 class Artist

我正在努力定义rails 4.2.4中的一些关系。目前,我有以下几点:

class Artist
  has_many :artist_members, dependent: :destroy
end

class ArtistMember < ActiveRecord::Base
  belongs_to :artist
end

我也在为迁移而挣扎,在这方面的任何帮助都是受欢迎的。

您想要实现的是一种自我参照的多对多关系

作为起点,您可以尝试以下解决方案:

模型

class Artist < ActiveRecord::Base
  has_many :artist_members
  has_many :artists, through: :artist_members,
                     source:  :colleague
end

class ArtistMember < ActiveRecord::Base
  belongs_to :artist
  belongs_to :colleague, class_name: "Artist"
end
现在只想找回简

> joe.artists.where(name: "Jane")
Artist Load (0.4ms)  SELECT "artists".* FROM "artists" INNER JOIN  
"artist_members" ON "artists"."id" = "artist_members"."colleague_id" 
WHERE "artist_members"."artist_id" = ? AND "artists"."name" = ?  
[["artist_id", 1], ["name", "Jane"]]
=> #<ActiveRecord::AssociationRelation [#<Artist id: 2, name: "Jane", 
art: nil, created_at: "2015-11-11 18:40:12", updated_at: "2015-11-11 
18:40:12">]> 

谢谢,这看起来确实是一个好的开始。在这个例子中,我可以在同事id中存储一个整数。我只需将艺术家的id发布为同事id即可。那么,如何将此id解析为还包含姓名?我想我需要在模型中添加其他内容?它与joe.artists一起工作。但是,我还有两个问题要解决。1目前,我们只能设置一名同事。2如何限制joe.artists仅获取某些字段而不是所有字段。非常感谢你的帮助我纠正了同事对艺术家的看法。关于你的问题1,我可以添加一个以上的artist_成员,并将其添加到示例中。对于你的问题2,我不太确定你想要实现什么。我添加了一个示例,仅选择一个artist_成员。如果不是这样,那就更准确地描述你想做什么。我通过以下方式解决了2:has_many:artists,->{select name},通过::artist_members,source::component。我想你不是真的明白我想要什么。我知道有可能有更多的艺术家。然而,我需要一个艺术家联盟成员来拥有更多的艺术家。现在它只能有一个。我想我需要把belngs_换成关系。明天我会再多看看。
class CreateArtists < ActiveRecord::Migration
  def self.up
    create_table :artists do |t|
      t.string  :name
    end
  end

  def self.down
    drop_table :artists
  end
end

class CreateArtistMembers < ActiveRecord::Migration
  def self.up
    create_table :artist_members do |t|
      t.integer :artist_id
      t.integer :colleague_id
      t.timestamps
    end  
  end

  def self.down
    drop_table :artist_members
  end
end
joe = Artist.create(name: "Joe")
jane = Artist.crate(name: "Jane")
joe.artists << jane
> joe = Artist.create(name: "Joe")
> jane = Artist.crate( name: "Jane")
> joe.artists << jane
> ben  = Artist.crate(name: "Ben")
> joe.artists << ben
> joe.artists.where(name: "Jane")
Artist Load (0.4ms)  SELECT "artists".* FROM "artists" INNER JOIN  
"artist_members" ON "artists"."id" = "artist_members"."colleague_id" 
WHERE "artist_members"."artist_id" = ? AND "artists"."name" = ?  
[["artist_id", 1], ["name", "Jane"]]
=> #<ActiveRecord::AssociationRelation [#<Artist id: 2, name: "Jane", 
art: nil, created_at: "2015-11-11 18:40:12", updated_at: "2015-11-11 
18:40:12">]>