Forum: Ruby on Rails Help needed with ActiveRecord

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
RubyNewbie (Guest)
on 2005-12-28 22:34
I am having issues with RoR/database relationships

I have 3 tables

Feeds (List of feeds)
FeedItems (List of items, feedsID)
FeedView (list of views and their list of feedsID)

I would like to be able to generate a view with the feeditems

For example, if the view has 2 feeds --> CNN & MSNBC and they both have
15 feeds in the feeditems table I want to be able to generate a view
with cnn and msnbc and have 5 feeds respectively.

**Little rusty on coding right now and very new to RoR**

Any pointers would be greatly appreaciated!!
Mike H. (Guest)
on 2005-12-29 00:48
(Received via mailing list)
I would have either 4 or 5 tables.

Feeds
Either (FeedItems) or (FeedItems and Feeds_FeedItems) - Depends on
whether the "items" are simply identifiers or objects that deserve their
own table
FeedViews - only holds info about the view, not what feeds it contains
Feeds_FeedViews - holds what feeds belong to what views

Assuming you wanted the first 5 items from each of the 2 feeds, and you
want no seperation between them, you would have code something like this

class FeedController
  def view_items #invoked by yoursite.com/feed/view_items/1
    @view = FeedView.find(params[:id])
    @items = @view.first_n_from_each_feed(5) #return an array of length
10
  end
end

class FeedView
  has_and_belongs_to_many :feeds
  def first_n_from_each_feed(n)
    items = Array.new
    feeds.each do |feed|
      items << feed.items[0...n]
    end
    items.flatten # causes method to return an array of 10 items, not an
array of 2 arrays, each with 5 items
  end
end

For the view, I would create a partial template, named _feeditem.rhtml.
The leading _ means the file is a partial template, as opposed to a
standard template.  That partial template (implicitly) takes a variable
"feeditem" representing the feeditem to be rendered.  The trivial
example:

<%= feeditem.title + "<br>" + feeditem.body %>

the <% %> denote ruby code, and the = tells it to output the result to
the page

In your view_items.rhtml (which the view_items action wants to invoke)
you'd want something like this

<%= render(:partial => "feeditem", :collection => @items ) %>

the partial parameter tells the method to render the partial template
"_feeditem.rhtml" and the collection paramater says to render each
element in the list items.  it's the same as doing this

<% for item in @items %>
  <%= render(:partial => "feeditem", :object => item %>
<% end %>

Helpful?
This topic is locked and can not be replied to.