0

所以我有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

我需要两件事:

  1. 获取某个faceid持有者的所有徽章

  2. 获得某个徽章的所有持有者。

我知道它真的是菜鸟问题,但直到现在我还没有使用参考资料,所以我从文献中并没有真正理解如何建立联系。

4

2 回答 2

1

实际上,您的持有者和徽章模型需要多对多关联。所以你必须选择 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 的连接表不应该有任何其他列而不是外键。

于 2013-02-28T23:48:37.917 回答
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关系。

于 2013-02-28T17:11:50.050 回答