这是我的表
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
我对属性has_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">]>
我哪里错了?
答案 0 :(得分:0)
试试这个
read_message_content = Message.where(have_read: 1).map{|msg| msg.content}
这将为您提供已阅读的所有消息内容
希望这有帮助
答案 1 :(得分:0)
要仅显示所选字段,您必须使用select
Message.select(:content).where(have_read: 1)
或
Message.all.select{ |m| m.have_read == 1 }.each do |m|
puts m.content
end
答案 2 :(得分:0)
正如其他人所说,你的一个问题是你测试
if m.have_read=1
会将have_read的值设置为1,因此它将始终通过if
测试,因为您有效地测试将其设置为1是否返回1,这样做(作为标准) setter方法在设置属性后返回传递的值。
所以你应该说
if m.have_read == 1
来测试它,因为==
是&#34;这是相等的&#34;运营商。 (我根据惯例添加了一些空格。)
另一个可能的问题是,如果这是一个布尔字段,它将作为1或0存储在数据库中(在其他数据库中,它可能是&#39;或者&#39; f&#39;或者其他值),但Rails在将其从表中读出时将其转换为布尔值,因此它将等于true
或false
。如果是这种情况,你应该说
if m.have_read == true
或者,你可以说
if m.have_read
在逻辑上是等价的,但更具可读性。