Я пытаюсь получить доступ к каждой строке, в таблице с петлей в консоли рельсов. Но я получаю неправильный 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

что логически эквивалентно, но более читабельно.

Другие вопросы по тегам