2

有两个表:userorder

create_table "orders" do | t |
t.text "name"
t.integer "user_id"
end

create_table "users" do | t |
t.text "email"
end

两个班:

class Order <ActiveRecord :: Base
  belongs_to: users
end

class User <ActiveRecord :: Base
   has_many: orders
end

控制器:

class TestController <ApplicationController
   def index
     @ tmp = Order.all(:include =>:users)
   end
end

问题:我需要所有订单,但不是user_idemail关联的订单user_id被退回

4

2 回答 2

1

欢迎来到 Stack Overflow,我自己是 Rails 新手,但试试这个:

@tmp = Order.all(
              :select => 'orders.id, orders.etc, users.email',
              :joins => "LEFT JOIN users on users.id = orders.user_id",
              # :conditions => ['column_name = ?', @value_of_your_choice],
              :order => 'orders.created_at ASC'
            )

你也可以试试这个:

class TestController < ApplicationController
  def index
    @tmp = Order.all()
  end
end

然后,在视图中:

<% @tmp.each do |order| %>

  <!-- do not show if orders.user.id is NULL -->
  <% if !order.user_id.nil? %>
    <tr>
      <td><%= order.id %></td>
      <td><%= order.user.email %></td>
    </tr>
  <% end %>
<% end %>

由于定义了两个模型之间的关系,因此您可以通过这种方式访问​​关联人员的属性。

您可能需要将其更改belongs_to: usersbelongs_to: userinuser.rb

于 2013-09-10T15:29:34.187 回答
1

我没有评论的声誉,但是关于 order.user.email 问题,请使用 try 方法:

order.user.try(:email)

如果用户为 nil,它只返回 nil,而不是引发异常。

于 2013-09-10T16:36:21.017 回答