使用另一个表中的对象播种ActiveRecord数据库

时间:2015-07-24 01:01:51

标签: ruby-on-rails activerecord

我是Rails的新手,我正在制作我的第一个应用程序而且我有(另一个)问题:

我在我的闪卡应用程序中添加了“卡片组”功能,但是在建模时出现问题,无法生成卡片表中的卡片对象填充的“卡片组”。

以下是我的协会:

> instance MyClass Integer; instance SubClass Integer where bar = id
> foo 3
[3]

这是我的甲板迁移/表格:

User has_many :decks

Deck belongs_to :user
Deck has_many :cards

Card belongs_to :deck




class Card < ActiveRecord::Base
  belongs_to :deck

  validates :front, presence: true
  validates :back, presence: true
  validates :deck_id, presence: true

end

我的问题是我希望decks表中的“card”列由Card对象组成,以便我可以访问/操作他们的方法,但我不确定如何做到这一点。我尝试使用t.string“:card”填充表格,希望这会起作用,但它只会出现空白。我想知道这是否可行或是否可取或是否有更好的方法?

如果有人能指出我的资源/提供建议,谢谢。我检查了文档/ SO,似乎找不到任何东西。

3 个答案:

答案 0 :(得分:2)

您所描述的内容很容易实现。

如果UserDeckCard ActiveRecord 模型,您可以通过设置外键来连接表来关联它们。外键是integer列,其中包含关联模型的id(其表的主键)

Rails约定是使用belongs_tohas_many来声明“一对多”关联(docs)。这些方法将向模型对象添加表示关联和与关联交互的必需方法。

在数据库模式方面,您需要在模型表上设置声明belongs_to关联的外键。

所以,如果你有这些模型:

class User < ActiveRecord::Base
  has_many :decks
end

class Deck < ActiveRecord::Base
  belongs_to :user
  has_many :cards
end

class Card < ActiveRecord::Base
  belongs_to :deck
end

您需要进行这些迁移:

class CreateDecks < ActiveRecord::Migration
  def change
    create_table :decks do |t|
      # your other columns...
      t.integer :user_id
    end
  end
end

class CreateCards < ActiveRecord::Migration
  def change
    create_table :cards do |t|
      # your other columns...
      t.integer :deck_id
    end
  end
end

答案 1 :(得分:1)

使用has_many关系时,不要将外键存储在拥有表中。相反,您在卡片表中有一个deck_id列。

使用关联的示例:

# Load a deck and include the cards in the query
@deck = Deck.joins(:cards).last

@deck.cards.each do |card|
  puts card.front
end

# create a new card
@deck.cards.new(front: 'foo', back: 'bar')
@deck.save # will save the card as well.
  

http://guides.rubyonrails.org/association_basics.html

答案 2 :(得分:1)

您不希望甲板表中的card列。模型中的has_many :cardsbelongs_to :deck行为您提供了@deck.cards等功能。

您必须确保在创建新的Card对象时指定deck_id。

您应该在associationsdatabase seeding上阅读Rails指南。