通过参考找到

时间:2013-02-28 17:02:13

标签: ruby-on-rails

所以我有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. 获得某个徽章的所有持有者。

  3. 我知道它真正的新闻问题,但直到现在我还没有使用参考文献,所以我真的不从文献中了解如何建立连接。

2 个答案:

答案 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关系。