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