1

对于我正在构建的简单闪存卡示例,我有以下数据库:

create_table "card_associations", :force => true do |t|
  t.integer  "card_id"
  t.integer  "deck_id"
end

create_table "cards", :force => true do |t|
  t.string   "question"
  t.string   "answer"
end

create_table "decks", :force => true do |t|
  t.string   "name"
  t.string   "description"
end

我已经通过我所有模型中的关系设置了 has_many。现在我希望能够从连接表中返回所有卡片的列表,给定卡片组 ID。如果我运行查询:

CardAssociation.find_by_deck_id(3).card

它会重新运行第一张卡组 ID 为 3 的卡。但是当我尝试时。

CardAssociation.find_all_by_deck_id(3).card

我得到错误

NoMethodError:未定义的方法“卡”#

有人可以帮我弄这个吗?我觉得我犯了一个非常简单的错误。

谢谢您的帮助

4

1 回答 1

1

find_all_* 方法总是返回一个数组(可能是空的)!

CardAssociation.find_all_by_deck_id(3) # => Array of results
CardAssociation.find_all_by_deck_id(3).first # => first result of the Array or nil if no result

我建议你先阅读Ruby on Rails Style Guide,然后使用 Rails3 的 ActiveRecord 查找对象的方式:

CardAssociation.where(:deck_id => 3) # => Array of results
CardAssociation.where(:deck_id => 3).first # => first result of the Array if exists

在您的情况下,可以在 Card 模型上设置范围:

你说:“现在我希望能够从连接表中返回所有卡片的列表,给定卡片组 id

class Card < ActiveRecord::Base
  scope :for_deck, lambda { |deck| joins(:card_associations).where('card_associations.deck_id = ?', deck.try(:id) || deck) }
end

这个范围可以像下面这样使用:

Card.for_deck(deck) # returns an Array of Card objects matching the deck.id

作用域中定义的参数Card.for_deck(deck)可以是deck对象deck_id(整数类型)

希望这有帮助!

于 2012-11-20T20:04:04.333 回答