我是Ruby on Rails的新手,我很想知道我的关联。
在我的公司,我们租用了扫描仪包,其中包括扫描仪和服务器。
当我们收到扫描仪包的请求时,理想情况下我会创建一个包含客户信息的新扫描包,但需要连接许多扫描仪和服务器。
以下是我的三个型号scan_pack,server和scanner:
scanner_pack.rb:
class ScannerPack < ActiveRecord::Base
attr_accessible :producer, :reserved_from, :reserved_to, :scanner_id, :server_id, :scanner_pack_id
has_many :scanners, :foreign_key => "scanner_id"
has_many :servers, :foreign_key => "server_id"
end
server.rb:
class Server < ActiveRecord::Base
attr_accessible :cat5, :power_cable, :router, :name, :status, :location, :id, :notes, :reserved_from, :reserved_to, :scanner_pack_id
belongs_to :scanner_pack, :class_name => "Server", :foreign_key => "server_id"
end
scanner.rb:
class Scanner < ActiveRecord::Base
attr_accessible :id, :location, :name, :notes, :serial, :status
belongs_to :scanner_pack, :class_name => "Scanner", :foreign_key => "scanner_id"
end
我已经搜索了很长一段时间并且已经搜索了很长一段时间,我注意到有时人们会说删除scan_pack模型中的scanner_so和scan_id和server_id的attr_accessible,因为它会覆盖关联。当我这样做时,我收到错误:
ActiveModel::MassAssignmentSecurity::Error: Can't mass-assign protected attributes:
在rails控制台中,当我尝试创建一个新的ScannerPack时,我正在做这样的事情:
scanner = Scanner.find(1)
ScannerPack.create(:producer => 12345, :scanner_id => scanner.id)
然后,如果我尝试这样的话:
scannerpack = ScannerPack.find(1)
scannerpack.scanner_id
它返回scanner_id
当我尝试:scannerpack.scanner.id
它给了我一个未定义的方法错误(我也试过scannerpack.scanners.id
)。在我看来,它应该从扫描仪对象
我认为我要么缺少一些非常简单的东西,要么我完全误解了如何做到这一点。也许我应该使用has_and_belongs_to_many
关联?我很感激任何人都可以给予帮助!
谢谢!
编辑:以下是github上的整个项目。
答案 0 :(得分:0)
由于您希望拥有多对多关联,因此以下是如何逐步实现此目标。
我们应该创建包含scanner_id
和scanner_pack_id
的模型。我们将它命名为Pack
(我相信你能够更好地命名)。
rails g model Pack scanner_id:integer scanner_pack_id:integer
rake db:migrate
当你运行它时,你必须在你的模型中写下appripriate“声明”:
class Pack
belongs_to :scanner
belongs_to :scanner_pack
end
class ScannerPack
has_many :packs
has_many :scanners, through: :packs
end
class Scanner
has_many :packs
has_many :scanner_packs, through: :packs
end
完成后,您可以轻松地将scanner_packs
与scanner
绑定(反之亦然):(例如):
scanner.scanner_packs << scanner_pack
答案 1 :(得分:0)
从belongs_to
和has_many
方法中删除所有其他参数,只保留关联名称。
错误就在这里
:class_name => "Server"
在这里
:class_name => "Scanner"
参考http://guides.rubyonrails.org/association_basics.html#belongs_to-association-reference(向下滚动到4.1.2 Options for belongs_to
和4.1.2.2 :class_name