postgresql - Is the first has_many redundant? - Ruby on Rails Active records associations -
rails 4.2 newbie:
2 questions;
1) first has_many redundant? since name plural of save class?
can have only:
has_many :savers, through: :saves, source: :saver
or better;
has_many :savers, through: :saves
if answer yes, can set "dependent: :destroy"?
class post < activerecord::base belongs_to :user has_many :saves, class_name: "save", foreign_key: "saver_id", dependent: :destroy has_many :savers, through: :saves, source: :saver end class save < activerecord::base belongs_to :saver, class_name: "user" validates :saver_id, presence: true end class user < activerecord::base has_many :posts, dependent: :destroy ... end
2) typical blog model, user can 'save' posts posted user timeline. model make use best practices? specially in db performance, doing join posts saved user. 'save' table have 100mm rows?
lets first alter example bit make naming less confusing:
class user has_many :bookmarks has_many :posts, through: :bookmarks end class post has_many :bookmarks has_many :users, through: :bookmarks end class bookmark belongs_to :user belongs_to :post end
lets have @ query generated when @user.posts
irb(main):009:0> @user.posts post load (0.2ms) select "posts".* "posts" inner join "bookmarks" on "posts"."id" = "bookmarks"."post_id" "bookmarks"."user_id" = ? [["user_id", 1]] => #<activerecord::associations::collectionproxy []>
now lets comment out has_many :bookmarks
, reload:
class user # has_many :bookmarks has_many :posts, through: :bookmarks end
irb(main):005:0> @user.posts activerecord::hasmanythroughassociationnotfounderror: not find association :bookmarks in model user
so no, first has_many
not redundant - in fact core of how has_many through:
works. setup shortcut of sorts through relation.
note in has_many :posts, through: :bookmarks
:bookmarks
name relation joining through. not table contains joins.
to fix original code need do:
class post < activerecord::base has_many :saves, dependent: :destroy has_many :savers, through: :saves end class save < activerecord::base belongs_to :saver, class_name: "user" belongs_to :post # join table 1 relation pretty worthless. validates :saver_id, presence: true end class user < activerecord::base has_many :posts has_many :saves, dependent: :destroy has_many :posts, through: :saves end
note don't need half junk - if have has_many :savers, through: :saves
activerecord relation saver
itself. want use dependent: destroy
on join model - not on post relation remove posts user has "saved" - written others!
Comments
Post a Comment