Ask A Question

Notifications

You’re not receiving notifications from this thread.

Using Named Scopes Across Models with ActiveRecord#Merge Discussion

Chris Oliver asked in General

You have to fix your latest blog Post excerpt on the home page.
Great site btw.

Reply

Doh! I'll get on that. My markdown parser sure didn't like that video.

Reply
Leung Ho Kuen Leung Ho Kuen

I am doing it with subquery
Like

Author.where(id: Book.available.select(:author_id))

I agree that your version is cleaner and easier to remember,
but you might want to add .distinct after joins to avoid duplicated authors.

Reply

Ah yes, great points! I like that as a subquery and definitely need the distinct for my example as well.

Reply
Văn Lý Vũ Văn Lý Vũ

this query will generate a long SQL query. it's not best practice.

Reply

Well, this is useful, but ugly... Thinking about querying, im not supposed to "merge" anything. IMHO

My wish was Author.books.scope(:available), lol

Reply

Well you can do Author.books.available because that's just querying Book.where(author_id: X).available. But obviously this is for the more complex joining tables case, so at least you're working with the models like you normally would. Not the best, but it saves you from duplication.

Reply
Văn Lý Vũ Văn Lý Vũ

Nice guys.

Reply
Blake Thomson Blake Thomson

Minor nitpick: but I really think you mean `ActiveRecord::Relation#merge`, not `ActiveRecord#merge`

Reply

(Y)

Reply

Something wrong with the video :/

Reply

Fixed!

Reply
godie mendoza godie mendoza

great! is ugly, but useful, thanks!

Reply
bodaonline bodaonline

Big thanks! Had a default scope on my Model but rails 4.2.5 didn't unscope it when I was doing "each do" so using the .joins(:model).merge(Model.scope) you suggested instead

Reply
Nicholas Thompson Nicholas Thompson

Could do something like:

scope :has_available_books, -> { joins(:books).merge(Book.available) }

Then you could just do:

Author.has_available_books

Reply
Konstantin Ivanov Konstantin Ivanov

Need to note that merges on the same attribute overrides each other.

class Book < ActiveRecord::Base
...
scope :red, ->{ where(color: "red") }
scope :green, ->{ where(color: "green") }
end

Author.joins(:books).merge(Book.red).merge(Book.green)
^ would apply only green, because overwrite previous merge

Reply
Join the discussion
Create an account Log in

Want to stay up-to-date with Ruby on Rails?

Join 86,140+ developers who get early access to new tutorials, screencasts, articles, and more.

    We care about the protection of your data. Read our Privacy Policy.