Thanks for the quick reply Jeremy. I'll take this into consideration and get back to this thread with any questions when I have a moment.
Nick On Fri, Mar 1, 2019 at 5:31 PM Jeremy Evans <[email protected]> wrote: > On Friday, March 1, 2019 at 3:37:16 PM UTC-8, Nick Appelmans wrote: >> >> Hello Sequel developers. >> >> I have three models; Member, Auth_user and Log. A log entry will be made >> by an Auth_user about a Member. The Auth_user is a member with special >> privileges (password, etc). See the model and postgresql table descriptions >> below. >> >> For every log entry, I am trying to identify the member the log was >> written about and the member (who is the auth_user) who created the log so >> that I can display the logged information along with the names of >> individuals involved. I can do it but I'm sure there's a better way. (I >> also would like to retrieve the relevant rows by starting with a Member or >> an Auth_user). I would appreciate any suggestions. Here's how I currently >> get the information... >> >> Start with a log entry >> >> > @log, @mbr, @au = Log, Member, Auth_user >> > > Kind of odd to assign a model class to an instance variable, but we can > run with it. > > >> given a log say, with id = 38 >> > >> To find the name of the member that the log was recording the transaction >> for... >> >> > mbr_name = @mbr[@log[38].values[:mbr_id]].values[:fname] >> > > Probably best to use model accessors and the association methods (after > fixing the association as described below): > > log = @log[38] > mbr_name = log.member.fname > > >> To find the name of the Auth_user that created the log... >> >> > au_name = @mbr[@au[@log[38][:a_user_id]].values[:mbr_id]].values[:fname] >> > > Same: > > au_name = log.auth_user.member.fname > > >> Do I need to explicitly set up an association other than what I've done >> below? Also, I'm thinking that I may have made a mistake in setting up the >> associations given that in the association_basics.rdoc the recommendation >> for a one-to-one relationship is... >> > > The one_to_one call in Auth_user should be a many_to_one call, as the > mbr_id column is a foreign key to members in the auth_users table. And the > one_to_one call in Member needs the :key and :class options set. The > one_to_many associations need to be plural and have the :key options set: > > Auth_user.many_to_one :member, key: :mbr_id > Auth_user.one_to_many :logs, key: :a_user_id > Member.one_to_one :auth_user, class: :Auth_user, key: :mbr_id > Member.one_to_many :logs, key: :mbr_id > > You may want to consider using AuthUser instead of Auth_user, as Auth_user > goes against standard model naming style. > > >> >> "If you want to setup a 1-1 relationship between two models, where the >> foreign key in one table references the associated table directly, you have >> to use many_to_one in one model, and one_to_one in the other model. How do >> you know which to use in which model? >> >> The simplest way to remember is that the model whose table has the >> foreign key uses many_to_one, and the other model uses one_to_one:" >> >> >> I thought that since an auth_user is also a member and not all members >> are auth_users, that would be one-to-one association set up on both sides. >> Am I mistaken. >> > > In Sequel, even if the database relationship is one-to-one, you don't use > one_to_one on both sides. On the model with the table with the foreign key, > you would use many_to_one. For the model with the foreign key, the code > for a one-to-one relationship is basically the same as a many-to-one, and > quite different from the code for a one-to-one relationship with the > foreign key in the other table (which is similar to the code for a > one-to-many relationship). I think the documentation you quoted (and the > ASCII art diagram that goes with it) does a decent job explaining it, but > I'm definitely open to pull requests to make it more clear. > > Thanks, > Jeremy > > -- > You received this message because you are subscribed to the Google Groups > "sequel-talk" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To post to this group, send email to [email protected]. > Visit this group at https://groups.google.com/group/sequel-talk. > For more options, visit https://groups.google.com/d/optout. > -- Nick Appelmans, Ph.D. (707) 834 6336 -- You received this message because you are subscribed to the Google Groups "sequel-talk" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at https://groups.google.com/group/sequel-talk. For more options, visit https://groups.google.com/d/optout.
