ThroughAssociations

James Bond wrote:

There is example: http://wiki.rubyonrails.org/rails/pages/ThroughAssociations

Example

Catalogue has_many :catalogue_items CatalogueItems belongs_to :catalogue; belongs_to :product Product has_many :catalogue_items

So how I can get:

catalogues.name catalogue_items.position products.name products. price WHERE catalogues.name LIKE "xxx%"

First of all, amend your association in Catalogue as follows - this will mean that the catalogue's items (and therefore products) will automatically be ordered by position.

Catalogue   has_many :catalogue_items, :order => "position"

Then, in the controller:

#do an include to eager load the relevant associations. @catalogues = Catalogue.find(:all, :conditions => ["name like ?", "#{a_variable}%"], :include => {:catalogue_items => :products})

And then, for example, in the view:

<% @catalogues.each do |catalogue| %>   <div>Catalogue:<%= catalogue.name %></br/>     <% catalogue.catalogue_items.each do |item| %>       <div class="product"><%= item.position %>: <%= item.product.name %>: <%= item.product.price %></div>     <% end %>   </div> <% end %>

Obviously you can put your own html around this, this is just a simple example.

Catalogue   has_many :catalogue_items, :order => "position"

Thanks, but if I want sot like:

:order => "catalogues.name!='#{@name}', catalogues.name, products.name"

Where @name is serarch word.

James Bond wrote:

Catalogue   has_many :catalogue_items, :order => "position"

Thanks, but if I want sot like:

:order => "catalogues.name!='#{@name}', catalogues.name, products.name"

Where @name is serarch word.

That doesn't make sense though - you're trying to shove a search condition into the order option, and you've got all sorts of syntax errors going on.

Can you explain, in english as opposed to code, what it is that you ultimately want to do? Neither of the things you've asked for have really made sense so i'm just guessing. You're asking how to do a particular bit of code but i don't think the code you're looking for is actually the code you need to do the job, if you know what i mean.

That's not any clearer - you're still just giving code examples. Like, with the two examples there, you don't say if either of them gives the results you want, and if they don't why not.

This:

:order => "catalogues.name!='#{@name}', catalogues.name"

doesn't even make sense to me - i'm amazed that you get any result back at all from it.

Say something like

"I want to find all catalogues matching a given name, order them by name and then list their products"

or whatever it is you're actually trying to do.

It is hard explain without example.

I need Full-Text Search

SELECT * FROM products WHERE MATCH(name) AGAINST('lamp') ORDER BY name

Returns:

"alarm lamp" "lamp" "trouble lamp" "wall lamp"

But: SELECT * FROM products WHERE MATCH(name) AGAINST('lamp') ORDER BY name!='lamp', name

Returns:

"lamp" "alarm lamp" "trouble lamp" "wall lamp"

Note difference, first result is "lamp" exactly same as search word was, and after that comes "alarm lamp" and so on..

So now we only add: catalogues.name, catalogue_items.position, products.name, products.price to results...