Forum: Ruby on Rails ThroughAssociations

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.
Fresh M. (Guest)
on 2009-02-11 18:21
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%"
Max W. (Guest)
on 2009-02-11 19:15
James B. 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.
Fresh M. (Guest)
on 2009-02-11 20:14
> 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.
Max W. (Guest)
on 2009-02-11 20:54
James B. 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.
Fresh M. (Guest)
on 2009-02-11 21:16
> Can you explain, in english as opposed to code, what it is that you
> ultimately want to do?

Sorry.

Search "way" I use is: match(catalogues.name) against "xxx"

And "order by" is (catalogues.name, products.name)

But first where catalogues.name == "xxx"

Example

If catalogues.names are: "aaa xxx", "xxx", "rrr xxx"
match(catalogues.name) against "xxx" will found them all and default
:order => "catalogues.name" will sort them like this:

1 "aaa xxx"
2 "rrr xxx"
3 "xxx"

But if I use :order => "catalogues.name!='#{@name}', catalogues.name"
order will be:

1 "xxx"
2 "aaa xxx"
3 "rrr xxx"
Max W. (Guest)
on 2009-02-11 22:09
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.
Fresh M. (Guest)
on 2009-02-11 22:35
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...
This topic is locked and can not be replied to.