我试图在 table 中访问每一行,在 rails 控制台中有一个循环。但我最终得到了一个错误的 o/p?

I am trying to access each row , in a table with a loop in rails console . But I am ending up with a wrong o/p?

这是我的table

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

但我得到了整个输出 table :

    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">]> 

我哪里错了?

试试这个

read_message_content = Message.where(have_read: 1).map{|msg| msg.content}

这会给你所有已读的消息内容

希望对您有所帮助

要仅显示选定的字段,您必须使用 select

Message.select(:content).where(have_read: 1)

Message.all.select{ |m| m.have_read == 1 }.each do |m| 
   puts m.content 
end

正如其他人所说,您的问题之一是您测试

if m.have_read=1

这会将 have_read 的值设置为 1,因此它将始终通过 if 测试,因为您实际上是在测试是否将其设置为 1 returns 1,它确实如此(作为标准 setter 方法 return 设置属性后传递的值)。

所以你应该说

if m.have_read == 1

来测试它,因为 == 是 "does this equal" 运算符。 (我按照约定添加了一些空格)。

另一个可能的问题是,如果这是一个布尔字段,它在数据库中存储为 1 或 0(在其他数据库中它可能是 't' 或 'f' 或其他值),但是 Rails 在从 table 中读取它时会将其转换为布尔值,因此它将等于 truefalse。如果是这种情况,你应该说

if m.have_read == true

或者,你可以直接说

if m.have_read

这在逻辑上是等价的,但更具可读性。