Q: все должности и связанные с ними комментарии выбор в одном запросе, загрузка комментариев отношение к p.comments, но выбрать только название из комментариеврельсы Активная запись выбора
Сообщение
#db
create_table :posts do |t|
t.string :title
t.text :text
t.timestamps
end
#modlel
class Post < ActiveRecord::Base
has_many :comments
end
Комментарий
#db
create_table :comments do |t|
t.string :title
t.text :text
t.integer :post_id
t.timestamps
end
#model
class Comment < ActiveRecord::Base
belongs_to :post
end
Что мне нужно: Отметить все комментарии и комментарии к ним в одном запросе и загрузить отношения комментариев в p.comments, но выберите только заголовок из комментариев:
posts = Post.includes(:comments).select("posts.*, comments.title")
posts.each do |p|
puts(p.title)
puts(p.text)
p.comments.each do |c|
puts(c.title)
end
end
Если первая часть сделана .includes:
posts = Post.includes(:comments).select('posts.*, comments.title')
posts.first.comments.loaded? # true
=> SELECT posts
. id
AS t0_r0, posts
. title
AS t0_r1, posts
. text
AS t0_r2, posts
. created_at
AS t0_r3, posts
. updated_at
AS t0_r4, comments
. id
AS t1_r0, comments
. title
AS t1_r1, comments
. text
AS t1_r2, comments
. post_id
AS t1_r3, comments
. created_at
AS t1_r4, comments
. updated_at
AS t1_r5 FROM posts
LEFT OUTER JOIN comments
ON comments
. post_id
= posts
. id
его полностью игнорирует выбор.
Хорошо, давайте попробуем присоединяется:
Post.joins(:comments).select('posts.*, comments.title')
=> SELECT сообщения * comments.title FROM posts
INNER JOIN comments
НА comments
.. post_id
= posts
. id
лучше, но нам нужно таблица псевдоним - Rails не обрабатывает отношения
posts = Post.joins(:comments).select('posts.*, comments.title as comments_title').first
=> SELECT сообщения * comments.title в comments_title ОТ posts
INNER JOIN comments
НА comments
(почему?). , post_id
= posts
. id
posts.first.comments.loaded? # false
posts.first.comments_title # "Comment 1.1"
Хорошо, давайте попробуем AREL
p = Post.arel_table
c = Comment.arel_table
posts = Post.find_by_sql(
p.join(c).on(c[:post_id].eq(p[:id])) \
.project(p[:id],p[:title],c[:id],c[:title]).to_sql
)
=> SELECT posts
. id
, posts
. title
, comments
. id
, comments
. title
ОТ posts
INNER JOIN comments
ON comments
. post_id
= posts
.id
та же история - ActiveRecord не обрабатывает отношение.
любые предложения?
UPD
, если этот вопрос не имеет прямого решения, может быть, есть способ использовать некоторые методы AR для преобразования в результате запроса. Потому что AR использует AREL, затем называет find_by_sql, а затем делает некоторую магию, которую я не могу найти, когда и когда она была выполнена, и альт: сгенерированные псевдонимы и ассоциации загрузки.
Возможно, существует решение для отношения «один-к-одному»?
Должности = Post.select ('posts.id, posts.title, comments.id, comments.title'). Включает (: комментарий) posts.first.comment.loaded? #true
=> SELECT posts
. id
AS t0_r0, posts
. title
AS t0_r1, posts
. text
AS t0_r2, posts
. created_at
AS t0_r3, posts
. updated_at
AS t0_r4, comments
. id
AS t1_r0, comments
. title
AS t1_r1, comments
. text
AS t1_r2, comments
. post_id
AS t1_r3, comments
. created_at
AS t1_r4, comments
. updated_at
AS t1_r5 FROM posts
LEFT OUTER JOIN comments
ON comments
. post_id
= posts
. id
tnx для связи. Если я не найду какое-либо решение, это будет полезно – AlexParamonov