Я пытаюсь получить доступ к каждой строке, в таблице с петлей в консоли рельсов. Но я получаю неправильный O / P?
Это мой стол
id content from to have_read created_at updated_at
1 xyz xxx qwe 0 xxxx xxxx
2 xyz xxx yyy 1 xxxx xxxx
3 xyt xxx xxx 0 xxxx xxxx
Я заинтересован в атрибуте have_read . В консоли rails я пытаюсь отобразить содержимое строки, содержащей "have_read=1".
Это код, который я использовал:
2.2.0 :187 > Message.all do |m|
2.2.0 :188 > if m.have_read=1
2.2.0 :189?> puts m.content
2.2.0 :190?> end
2.2.0 :191?> end
Но я получил вывод всей таблицы:
Message Load (0.2ms) SELECT "messages".* FROM "messages"
=> #<ActiveRecord::Relation
[#<Message id: 1, content: "hey", from: "sun@g.com", to: "nev@n.com", have_read: nil, created_at: "2015-03-26 05:40:08", updated_at: "2015-03-26 05:40:08">,
#<Message id: 2, content: "hey", from: "nev@n.com", to: "sun@g.com", have_read: 1, created_at: "2015-03-26 05:42:20", updated_at: "2015-03-26 05:42:20">,
#<Message id: 3, content: "hey", from: "nev@n.com", to: "sun@g.com", have_read: nil, created_at: "2015-03-26 05:55:15", updated_at: "2015-03-26 05:55:15">]>
Куда я иду не так?
3 ответа
Чтобы показать только выбранное поле, вы должны использовать select
Message.select(:content).where(have_read: 1)
или же
Message.all.select{ |m| m.have_read == 1 }.each do |m|
puts m.content
end
Попробуй это
read_message_content = Message.where(have_read: 1).map{|msg| msg.content}
Это даст вам весь контент сообщения, который был прочитан
Надеюсь это поможет
Как уже говорили другие, одна из ваших проблем в том, что вы тестируете
if m.have_read=1
который установит значение have_read равным 1, и поэтому он всегда будет передавать if
test, поскольку вы эффективно проверяете, возвращает ли значение 1 значение 1, что и происходит (поскольку стандартные методы установки возвращают переданное значение после установки атрибута).
Так что вы должны сказать
if m.have_read == 1
чтобы проверить это, так как ==
является оператором "делает это равным". (Я добавил некоторые пробелы в соответствии с соглашениями).
Другая возможная проблема заключается в том, что если это логическое поле, оно сохраняется в базе данных как 1 или 0 (в других базах данных это может быть 't' или 'f' или другие значения), но Rails преобразует его в логическое значение, когда оно читает его из таблицы, поэтому он будет равен true
или же false
, Если это так, вы должны сказать
if m.have_read == true
или вы можете просто сказать
if m.have_read
что логически эквивалентно, но более читабельно.