实际上,您的持有者和徽章模型需要多对多关联。所以你必须选择 usehas many :through
或 use has_and_belongs_to_many
。两者的区别可以在这里找到。我以has_many :through
.
您需要创建三个模型。
class Holder < ActiveRecord:Base
has_many :badges_holders
has_many :badges, :through => :badges_holders
end
class Badge < ActiveRecord:Base
has_many :badges_holders
has_many :holders, :through => :badges_holders
end
class BadgesHolder < ActiveRecord:Base
belongs :badge
belongs :holder
end
您的迁移文件需要:
create_table "holders", :force => true do |t|
t.string "faceid"
t.timestamps
end
add_index "holders", ["badges_id"], :name => "index_holders_on_badges_id"
create_table "badges", :force => true do |t|
t.string "name"
t.text "description"
t.timestamps
end
create_table "badges_holders", :force => true do |t|
t.integer "holder_id"
t.integer "badge_id"
t.timestamps
end
现在,您可以轻松Holder.find_by_faceid('xyz').badges
地找到面为 xyz 的持有人持有的所有对冲。并Badge.first.holders
让所有持有者获得第一张床。
对于您的问题,HABTM 将是一个不错的选择,因为您不需要连接表中的任何额外字段,因此您可以has_and_belongs_to_many
在两个模型中使用,并且在这种情况下不需要BadgesHolder
模型。对于连接表的迁移,将第一行替换为create_table "badges_holders", :id => false, :force => true do |t|
a 并删除t.timestamps
,因为 HABTM 的连接表不应该有任何其他列而不是外键。