通过ActiveRecord从表中检索某些行

时间:2011-03-27 21:10:29

标签: ruby-on-rails activerecord haml

我是非常 Ruby on Rails的新手,来自C ++背景,因此其中一些东西有些令人困惑。如果这个问题听起来有些迟钝,请耐心等待,但我很难过。

说我有一个名为Bet的课程:

class Bet < ActiveRecord::Base

投注表如下:

  create_table "bets", :force => true do |t|
    t.string   "text"
    t.boolean  "completed",       :default => false
    t.boolean  "won_by_bettor"
    t.integer  "bet_against"
    t.datetime "twitter_tstamp"
    t.integer  "user_id"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "tweet_id"
  end

我正在尝试在.haml文件中检索并显示某些赌注(例如,基于user_id)。我怎么能这样做?

如果我在.haml文件中尝试这样的事情:

  

#{Bet.find(:所有)}

我得到的东西看起来像这样:

#<Bet:0x2aaefc6c3920>#<Bet:0x2aaefc6be0b0>#<Bet:0x2aaefc6bdfc0>#<Bet:0x2aaefc6bdf20>#<Bet:0x2aaefc6bde80>#<Bet:0x2aaefc6bdde0>#<Bet:0x2aaefc6bdd40>#<Bet:0x2aaefc6bdca0>#<Bet:0x2aaefc6bdc00>#<Bet:0x2aaefc6bd368>#<Bet:0x2aaefc6bd278>#<Bet:0x2aaefc6bd1d8>#<Bet:0x2aaefc6bd0e8>#<Bet:0x2aaefc6bd048>#<Bet:0x2aaefc6bcfa8>

这显然不是我想要显示的内容。

任何帮助都会非常感激。

编辑(基于nathanvda的答案/建议)

我将澄清我想要做的事情:我能够显示用户所做的所有投注;但是,我也试图显示其他人用户进行的投注。这就是我遇到障碍的地方。

我的逻辑是检查赌注表,其中“bettee”=用户(缺少一个更好的单词,对其进行下注的用户),然后显示这些赌注。因此,我理想地喜欢我的show方法来显示所有的AGAINST(不是 - 因为这已经在工作)投注了用户。

我有一个简单的问题:该方法是否需要被称为“show”?或者它应该被称为“索引”?或者名称是否重要,基于它对应的视图?我目前已将该方法实现为“show”但我仍然收到错误,由于某种原因,我认为视图(show.html.haml)无法“界面”(再次,因为缺乏一个更好的词)与bet_controller.rb。在视图的最后两行(第68和69行,我注释掉了 - pastebin.com/rJWMntL0),当我使用dmarkow建议的时候,我得到一个错误(“我们很抱歉,但出了点问题“)。

3 个答案:

答案 0 :(得分:1)

在你的控制器方法中,如果你想根据用户ID找到赌注,你可以这样做:

@bets = Bet.where("user_id = ?", 1)

然后在你看来,这将迭代下注:

- for bet in @bets
  = bet.text
  -# insert anything else you'd want to output

答案 1 :(得分:1)

从您的评论我可以看到它仍然是非常新的。 Rails是MVC,简而言之,它意味着C = Controller收集所有数据。

您是否使用脚手架来创建bets_controller.rb?我猜不是,您应该尝试在应用程序的根文件夹中的命令行。做点什么

rails g scaffold Bet  text:string completed:boolean won_by_bettor:boolean ...

并添加所有字段。这将创建模型,迁移,控制器和示例视图。 入门时,这是了解一切如何联系在一起的好方法。

然后你会看到在控制器内部检索所有数据(模型),并且视图仅进行渲染。在控制器内部,您可以设置一些实例变量(例如@bets),然后这些变量将在视图中可用。

因此在控制器中会有一个index方法,它具有以下代码

def index
  @bets = Bet.find(:all)
end

在视图中你只需渲染它们。

所以@dmarkow的答案是完全正确的,但对你来说可能还有点太深。

无论如何:我建议选择一本好书,比如Agile Web Development With Rails,这非常适合入门。

[编辑:查看粘贴后添加]

不确定,但您似乎错过了show方法。如果我理解正确,在单个投注的show内,您想列出单个用户的所有投注?实际上,要成为更多REST,那将是用户显示视图,或用户范围的bets-view或标准bets-view。通常的做法是,如果用户访问索引页面,他只能看到自己的项目(在这种情况下为bets - 而不是所有现有的投注:只有管理员会看到这些投注)。

因此,虽然不像REST那样在投注show-view中显示投注列表,但这绝对是可能的。

此外,我在您的视图中看到,您尝试查找用户的所有赌注:这通常是您将放置在控制器内的代码。您希望将视图中的代码保持在最低限度。 在bets_controller.rb我想添加

def show
  @bets = @user.bets.order("twitter_tstamp DESC")
end

在您的视图中,您将使用@bets.each代替。对于其他人,我反对使用单个字母w(这对我没有意义 - 但也许它对你有用);对于bet,我建议使用b,但使用Rubymine,您不再有任何借口可以保存您的变量名称:它只会让您的代码在以后很难阅读。

在您展示的视图中哪些不起作用?您在哪一行收到错误?

答案 2 :(得分:0)

当你说Bet.find(:all)时,你会得到一个迭代器,#{}会在其内容上调用.to_s来生成一个字符串。所以,像这样:

"Blah blah #{Bet.find(:all)} mumble"

非常像这样:

"Blah blah " + Bet.find(:all).to_s + " mumble"

所以你得到了一堆内存地址和废话。

请参阅dmarkow的答案以更好地了解您应该做什么,但如果您使用的是Rails 2则需要

@bets = Bet.find(:all, :conditions => [ 'user_id = ?', 1])

as,AFAIK,.where已添加到Rails 3中。