我一直在尝试使用两个不同模型中的两个属性,因此它们可以与索引视图中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)
Amoung其他人,我的观点如下:
我的观看代码:
<% 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>
我已尝试相应地更改视图中的变量,但无济于事。我想在预订活动的特定日期显示用户名和用户链接。
答案 0 :(得分:2)
我看到两个问题,虽然我不熟悉日历库。
首先,确保控制器中的查询返回有用的内容。在你给我们的三行中,第一行甚至不搜索,它调用未定义变量的方法。第二个接近工作,但你正在寻找一个日期并将其与真实相匹配......怎么样:
@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循环不是很rubyish。 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 %>