Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 参照查找_Ruby On Rails - Fatal编程技术网

Ruby on rails 参照查找

Ruby on rails 参照查找,ruby-on-rails,Ruby On Rails,所以我有两个模型: 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

所以我有两个模型:

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持有者的所有徽章

  • 获得某个徽章的所有持有者


  • 我知道这是一个很难回答的问题,但直到现在我还没有研究过参考资料,所以从文献中我不太了解如何建立连接。

    如果是Ruby on Rails,你必须有两种型号:

    class Holder < ActiveRecord:Base
      has_many :badges
    end
    
    class Badge < ActiveRecord:Base
      belongs_to :holder
    end
    


    如果您的
    徽章
    可以属于多个持有者,那么您必须编写一个
    has_和_belies_to_many
    关系。

    您的持有者和徽章模型实际上需要多对多关联。因此,您必须选择使用
    has many:through
    或使用
    has\u和\u beliens\u to \u many
    。两者之间的差异可以找到。我举的例子是
    有很多:通过

    您需要创建三个模型

     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
    
    现在你可以很容易地使用
    Holder.find by_faceid('xyz')。徽章
    查找面为xyz的持有者持有的所有对冲。和
    Badge.first.holders
    以获取第一个床位的所有持有者


    对于您的问题,HABTM将是一个很好的选择,因为您不需要联接表中的任何额外字段,因此您可以在两种型号中使用
    has\u和\u-belish\u-many
    ,在这种情况下,您不需要
    BadgesHolder
    model。对于连接表的迁移,将第一行替换为
    create_table“badges_holders”,:id=>false,:force=>true do | t |
    a并删除
    t。时间戳
    ,因为HABTM的连接表不应该有外键以外的任何列。

    谢谢@forghtnerform。我的模型已经设置好了,里面有数据。我是否可以在正确的模型文件中添加has many and belowns_to行,并在重新启动服务器后将其连接?不幸的是,不是。两个表中都需要有引用。现在在db中设置的方式很容易在徽章和持有人之间进行1对N操作(例如,每个徽章可能有多个持有人,但每个持有人最多有一个徽章),但您需要N对N,因此您需要第三个表来实现徽章持有人关系。不要惊慌,在不删除您的数据的情况下仍然可以,但是添加
    has_和_besign_to_many
    不会起作用。您的数据库中是否已经存在徽章和持有者之间的关系,即是否存在徽章id不为空的持有者?根据这一点,我可以提出不同的迁移:选项1-保留现有的引用,选项2-不关心这一点,因为没有引用。
    Badge.find(1337).holder
    
     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