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

时间:2015-03-26 07:45:27

标签: ruby-on-rails rails-console

这是我的表

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

我哪里错了?

3 个答案:

答案 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在将其从表中读出时将其转换为布尔值,因此它将等于truefalse。如果是这种情况,你应该说

if m.have_read == true

或者,你可以说

if m.have_read

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