我试图在 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 中读取它时会将其转换为布尔值,因此它将等于 true
或 false
。如果是这种情况,你应该说
if m.have_read == true
或者,你可以直接说
if m.have_read
这在逻辑上是等价的,但更具可读性。
这是我的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 中读取它时会将其转换为布尔值,因此它将等于 true
或 false
。如果是这种情况,你应该说
if m.have_read == true
或者,你可以直接说
if m.have_read
这在逻辑上是等价的,但更具可读性。