Ruby on rails 如何创建has_many:通过使用Rails 4、seeds.rb和控制台与状态验证的关联?

Ruby on rails 如何创建has_many:通过使用Rails 4、seeds.rb和控制台与状态验证的关联?,ruby-on-rails,Ruby On Rails,我使用的有很多:通过音乐家和乐器之间的关联,通过音乐家乐器连接表: class Musician < ActiveRecord::Base has_many :musicians_instruments has_many :instruments, through: :musicians_instruments end class Instrument < ActiveRecord::Base has_many :musicians_instruments has_

我使用的
有很多:通过
音乐家和
乐器之间的关联,通过
音乐家乐器
连接表:

class Musician < ActiveRecord::Base
  has_many :musicians_instruments
  has_many :instruments, through: :musicians_instruments
end

class Instrument < ActiveRecord::Base
  has_many :musicians_instruments
  has_many :musicians, through: :musicians_instruments
  validates :instrument_name, presence: true
end

class MusiciansInstrument < ActiveRecord::Base
  belongs_to :musician
  belongs_to :instrument 
  validate :began_playing, presence: true
end
我的问题是,在控制台中创建种子和查询对象时,如何最好地使用此关联创建对象。我还需要让FactoryGirl做这些,但首先要做的是

1) 在控制台中(使用中建议的方法)


seeds.rb语句可以工作,并且确实创建了相关的对象,并使用
start\u playing
date填充了through表,但是查询是错误的。查询has\u many:through join表上的
开始播放
字段的两种方法是:

MusiciansInstrument.joins(:musician).where.not(began_playing: nil) 
#=> #<ActiveRecord::Relation [#<MusiciansInstrument id: 13, musician_id: 7, instrument_id: 7, began_playing: "1984-02-26 03:59:01">]> 

MusiciansInstrument.joins(:instrument).where.not(began_playing: nil) 
#=> #<ActiveRecord::Relation [#<MusiciansInstrument id: 13, musician_id: 7, instrument_id: 7, created_at: "2014-02-26 03:59:01", updated_at: "2014-02-26 03:59:01", began_playing: "1984-02-26 03:59:01">]>

伙计,这只是时间戳:PIn你的1),你还没有音乐家ID,你得到一个音乐家异常。保存!。您必须在创建关联之前保存音乐家。谢谢,初学者的错误。我一直在使用has_和_-allown_-to_-many,对需要乐器的音乐家有验证限制,并且已经习惯了在没有先给它乐器的情况下无法创建音乐家。当我改用has_许多:通过这成为一个致命的习惯。这就回答了#1,如果你把你的评论作为答案发表,我会加上分数。我仍然会在#2中遇到同样的错误,即使使用create制作音乐家,但我的查询可能是错误的,因此我无法判断seeds.rb是否与之有良好的关联。这没关系。第二,这是相同的想法。实际上,所有由
seeds.rb创建的
MusiciansInstrument
实例都是这样的,
#
。所有的
都为零,开始播放
。所以#2还在风中。。。。加上关于仍然抛出
namererror
的查询。
musician = Musician.new 
#=> #<Musician id: nil, user_id: nil, created_at: nil, updated_at: nil> 
instrument = Instrument.new(:instrument_name => 'Bass Guitar') 
#=> #<Instrument id: nil, created_at: nil, updated_at: nil, instrument_name: "Bass Guitar"> 
instrument.save!
musician.musicians_instruments << MusiciansInstrument.create(:instrument => instrument, :began_playing => Time.now - 10.years)
#=> #<ActiveRecord::Associations::CollectionProxy [#<MusiciansInstrument id: 19, musician_id: nil, instrument_id: 15, began_playing: "2004-02-25 23:52:12">]>
musician.save! 
#=> ActiveRecord::RecordInvalid: Validation failed: Instruments can't be blank
m7 = Musician.create
i7 = Instrument.create(:instrument_name => 'Voice')
m7.musicians_instruments << MusiciansInstrument.create(:instrument => i7, :began_playing => Time.now - 10.years)
Musician.includes(:instruments).where(instruments.instrument_name => "Voice") #=>NameError: undefined local variable or method `instruments' for main:Object

Musician.joins(:instruments).where(instruments.instrument_name => "Voice") #=>NameError: undefined local variable or method `instruments' for main:Object
MusiciansInstrument.joins(:musician).where.not(began_playing: nil) 
#=> #<ActiveRecord::Relation [#<MusiciansInstrument id: 13, musician_id: 7, instrument_id: 7, began_playing: "1984-02-26 03:59:01">]> 

MusiciansInstrument.joins(:instrument).where.not(began_playing: nil) 
#=> #<ActiveRecord::Relation [#<MusiciansInstrument id: 13, musician_id: 7, instrument_id: 7, created_at: "2014-02-26 03:59:01", updated_at: "2014-02-26 03:59:01", began_playing: "1984-02-26 03:59:01">]>
Musician.joins(:musicians_instruments).where.not(:musicians_instruments.began_playing => nil)