所以我有2个型号:
create_table "holders", :force => true do |t|
t.string "faceid"
t.integer "badges_id"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
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.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
end
我需要两件事:
获取某个faceid持有者的所有徽章
获得某个徽章的所有持有者。
我知道它真正的新闻问题,但直到现在我还没有使用参考文献,所以我真的不从文献中了解如何建立连接。
答案 0 :(得分:1)
您实际上需要在持有人和徽章模型上进行多对多关联。因此,您必须使用has many :through
或使用has_and_belongs_to_many
。可以找到两者之间的差异here。我以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
,而不需要{{1}那种情况下的模型。对于连接表的迁移,将第一行替换为BadgesHolder
a并删除create_table "badges_holders", :id => false, :force => true do |t|
,因为HABTM的连接表不应包含除外键之外的任何其他列。
答案 1 :(得分:0)
如果是Ruby on Rails,你必须拥有2个模型:
class Holder < ActiveRecord:Base
has_many :badges
end
class Badge < ActiveRecord:Base
belongs_to :holder
end
您的badges_id
条目不应在您的holders
表格中;你的“徽章”表上应该有一个holder_id
。
然后,您只需致电
Holder.find_by_faceid('foobar').badges
和
Badge.find(1337).holder
如果您的badge
可以属于许多持有者,那么您必须写一个has_and_belongs_to_many
关系。