首先...提醒一句:railscast 已经很老了。在那一集中,可能有一些语法上的东西已经被新版本的 rails 过时了。
问题 1
如果您使用 has_many through 方法,那么您必须在连接模型中有一个 id 列,因为您使用的是完整的模型。正如 Ryan 在剧集中提到的,如果您需要跟踪其他信息,您将选择此方法。如果您使用 has_and_belongs_to_many 方法,您的表中将没有 id 列。
如果您想在多对多关联中实现不允许重复的检查(即允许项目 a 与项目 b 配对,并再次允许项目 a 到项目 b 的另一条记录),您可以使用一个简单的使用范围验证行:
validates_uniqueness_of :model_a_id, :scope => [:model_b_id]
问题2
您可以使用此代码在迁移中添加索引
add_index :table_name, [ :join_a_id, :join_b_id ], :unique => true, :name => 'by_a_and_b'
这将被插入到您的 create_table 语句下方的更改块中(但不在该 create_table 块中)。查看此问题以了解更多详细信息:在连接表中,Rails 缺少复合键的最佳解决方法是什么?
问题 3
我不完全清楚你想要完成什么,但如果你想在每次将新记录插入连接模型时采取一些行动,我会使用 after_create 活动记录挂钩。那看起来像这样。
class YourJoinModel < ActiveRecord::Base
after_create :do_something
def do_something
puts "hello world"
end
end
每次创建新记录时都会调用该函数 do_something。
问题 4
使用 has_many through 方法将使您能够访问您在该模型中定义的关系两侧的附加属性。例如,如果您有此设置:
class Factory < ActiveRecord::Base
has_many :widgets, :through => :showcases
end
class Widget < ActiveRecord::Base
has_many :factories, :through => :showcases
end
class Showcases < ActiveRecord::Base
belongs_to :factory
belongs_to :widget
attr_accessiable :factory_id, :widget_id, :visible
end
你可以说类似
widget = Widget.first
shown = widget.showcases
shown.first.visible
或者
shown = widget.showcases.where( :visible=> true )
您还可以联系其他协会:
shown.first.factory