我是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,似乎找不到任何东西。
答案 0 :(得分:2)
您所描述的内容很容易实现。
如果User
,Deck
和Card
是 ActiveRecord 模型,您可以通过设置外键来连接表来关联它们。外键是integer
列,其中包含关联模型的id
(其表的主键)
Rails约定是使用belongs_to
和has_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.
答案 2 :(得分:1)
您不希望甲板表中的card
列。模型中的has_many :cards
和belongs_to :deck
行为您提供了@deck.cards
等功能。
您必须确保在创建新的Card对象时指定deck_id。
您应该在associations和database seeding上阅读Rails指南。