Rails:视图中的两个属性不同的表

Posted

技术标签:

【中文标题】Rails:视图中的两个属性不同的表【英文标题】:Rails: two attributes diffrent tables in view 【发布时间】:2011-05-04 12:09:56 【问题描述】:

我一直在尝试使用来自两个不同模型的两个属性,以便它们可以与 index 视图中 table_builder 插件提供的 calendar_for 方法一起使用。我已经阅读了http://guides.rubyonrails.org/active_record_querying.html#retrieving-multiple-objects 的 Rails 指南和 Ruby on Rails: How to join two tables 等帖子,但我一定是做错了什么。

我的模型如下:

Class Event < ActiveRecord::Base
belongs_to :user

class User < ActiveRecord::Base
User has_many :events

我在控制器中尝试过的不同方法(不是一次全部)是:

@event.user.name
@users = User.joins(:event).where(:event => :event_date => true)
@users = User.where(:event => :event_date)

在其他人中,我的观点如下:

我的查看代码:

<% calendar_for @users, :year => @date.year, :month => @date.month do |calendar| %>
<%= calendar.head('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday',   'Saturday') %>
<% calendar.day(:day_method => :created_at) do |date, users| %>
<%= date.day %>
  <ul>
    <% for user in users %>
      <li><%= link_to h(user.name), user %></li>
    <% end %>
  </ul>
<% end %>
<% end %>
</div>

我已尝试相应地更改视图中的变量,但无济于事。我想在预订活动的特定日期显示用户名和用户链接。

【问题讨论】:

针对所有用户还是针对一个用户? 适用于所有用户,因此每天应该显示当天有活动的用户。 【参考方案1】:

我看到了两个问题,虽然我不熟悉日历库。

首先,确保控制器中的查询返回有用的信息。在您给我们的三行中,第一行甚至不搜索,它调用未定义变量的方法。第二个接近工作了,但是您正在搜索一个日期并将其与 true 匹配...怎么样:

@users = User.joins(:event).where('events.event_date is not null')

此外,如果您有日期范围,则可以将其包含在搜索中:

@users = User.joins(:event).where('events.event_date > ? and events.event_date < ?', start_date, end_date)

接下来在视图中,您与变量命名不一致。控制器设置了 @users 变量,您访问过一次,但后来您错过了它前面的 @,这不是一回事。我不知道日历部分想要什么作为输入,但至少 for 循环应该是:

for user in @users

也就是说,for 循环不是很红。 ruby 方式是使用each:

@users.each do |user|
  ...
end

或者更好的是,制作所有链接:

<ul>
<%= @users.collect |user| content_tag(:li, link_to h(user.name), user).join  %>
</ul>

编辑

根据更多信息,我认为您从错误的地方开始。让我们从事件开始。

Event.joins(:users).where('events.event_date is not null')


<% calendar_for @events, :year => @date.year, :month => @date.month do |calendar| %>
  <%= calendar.head('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday',   'Saturday') %>
  <% calendar.day(:day_method => :event_date) do |date, events| %>
    <%= date.day %>
    <ul>
      <% for event in events %>
        <li><%= link_to h(event.user.name), event.user %></li>
      <% end %>
    </ul>
  <% end %>
<% end %>

【讨论】:

我已经用您的第一个建议替换了控制器变量,因为我没有日期范围,这可以正常工作。现在我在索引中收到“未找到关联命名事件”的错误;也许我拼错了'它在视图中的 行中抛出了这个错误,然后才到达每个循环的 ruby​​ish。我是 Rails 新手,一直在使用 Railscasts railscasts.com/episodes/213-calendars> 作为日历。 我已经取得了进展,但是我只想将 caledar.day(:day_method 更改为 => event_date 而不是 :created_at 仅显示创建用户的日期而不是事件的日期on。我认为我需要加入这两个表才能访问此日期? 听起来像是在传递给日历的对象上调用“day_method”,在这种情况下,您需要将事件对象传递给日历,而不是用户。 更新了从事件而不是用户开始的答案 不高兴,Rails 在控件中出错,出现“未定义的方法 `joins'” 我错过了模型中的范围吗?因为我无法让它工作。

以上是关于Rails:视图中的两个属性不同的表的主要内容,如果未能解决你的问题,请参考以下文章

两个不同的表连接视图

在两个不同的表中创建具有相同列的视图 SQL

Rails:分离两个非常相似的视图的最佳方法是啥?

Rails - 从视图中的索引操作访问实例变量属性

(Rails)从不同视图中的控制器访问方法

在 Rails 中嵌套资源时的不同视图