Извлечение определенных строк из таблицы через ActiveRecord - PullRequest
0 голосов
/ 28 марта 2011

Я очень новичок в 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

Я пытаюсь получить и отобразить определенные ставки (например, на основе user_id) в файле .haml. Как я мог сделать это?

Если я попробую что-то подобное в моем файле .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>

Что явно не то, что я хочу показать.

Любая помощь будет очень признательна.

РЕДАКТИРОВАТЬ (на основе ответов / предложений Натанвды)

Я уточню, что именно я хочу сделать: я могу отображать все ставки, сделанные пользователем против кого-либо еще; однако я также пытаюсь отобразить ставки, сделанные кем-то другим против пользователя. Вот где я нахожусь на контрольно-пропускном пункте.

Моя логика состоит в том, чтобы проверить таблицу ставок, в которой "bettee" = пользователь (из-за отсутствия лучшего слова, пользователь, против которого сделана ставка), и затем отобразить эти ставки. Таким образом, в идеале мне бы хотелось, чтобы мой метод показа отображал все ставки, сделанные ПРОТИВ (а не - поскольку это уже работает) пользователя.

У меня простой вопрос: НУЖЕН ли метод "show"? Или это должно называться «индекс»? Или имя имеет значение, основываясь на представлении, которому оно соответствует? В настоящее время я реализовал метод как «show», но все еще получаю ошибку, которая по какой-то причине заставляет меня думать, что представление (show.html.haml) не может «взаимодействовать» (опять же, из-за отсутствия лучшего слова) с bet_controller.rb. В последних двух строках представления (строки 68 и 69, которые я закомментировал - pastebin.com / rJWMntL0 ), когда я использую именно то, что предложил dmarkow, я получаю сообщение об ошибке («Мы извините, но что-то пошло не так. ").

Ответы [ 3 ]

1 голос
/ 28 марта 2011

из ваших комментариев я вижу, что это все еще очень ново.Rails - это MVC, короче говоря, это означает, что контроллер C = собирает все данные.

Использовали ли вы строительные леса для создания 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 - и не все существующие ставки: их увидит только администратор).

Так что, хотя в отличие от REST показывать список ставок в окне просмотра ставок, это определенно возможно.

Также я видел, что в вашем представлении вы пытаетесь найти все ставкипользователя: это, как правило, код, который вы вместо этого поместите в контроллер.Вы хотите, чтобы код по вашему мнению был минимальным.ТАК внутри вашего bets_controller.rb я бы добавил

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

, а внутри вашего представления вы бы использовали @bets.each вместо этого.В остальном я возражаю против использования одной буквы w (что не имеет смысла для меня - но, может быть, это для вас);для bet я бы предложил b, но с Rubymine у ​​вас больше нет оправданий сохранять имена переменных: это только делает ваш код ужасно трудным для чтения в дальнейшем.

Что не делает?не работает в представлении, которое вы показываете?На какой строке вы получаете сообщение об ошибке?

1 голос
/ 28 марта 2011

В методе вашего контроллера, если вы хотите найти ставки на основе идентификатора пользователя, вы можете сделать это:

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

Тогда, на ваш взгляд, это будет повторять ставки:

- for bet in @bets
  = bet.text
  -# insert anything else you'd want to output
0 голосов
/ 28 марта 2011

Когда вы говорите 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.

...